2013-11-04 117 views
18
class A 
{ 
    protected: 
    string word; 
}; 

class B 
{ 
    protected: 
    string word; 
}; 

class Derived: public A, public B 
{ 

}; 

如何将变量的无障碍wordDerived受到影响?我将如何解决它?多重继承:相同的变量名

+4

请注意,除了下面的良好答案之外,尽可能避免此类名称冲突总是一个好策略。 –

回答

27

这将是明确的,并且你会得到一个编译错误说。

你需要使用正确的范围内使用它:

class Derived: public A, public B 
{ 
    Derived() 
    { 
     A::word = "A!"; 
     B::word = "B!!"; 
    } 
}; 
3

当全班同学的Derived访问word,你不得不宣布

class Derived: public A, public B 
{ 
    Derived() 
    { 
     A::word = X; 
     //or 
     B::word = x; 
    } 
}; 
5

你的类Derived将有两个变量,B::wordA::wordDerived你可以这样访问它们(如果你改变自己的访问市民):

Derived c; 
c.A::word = "hi"; 
c.B::word = "happy"; 

试图访问c.word将导致错误,因为没有现场机智h名称word,但只有A :: word和B :: word。

里面Derived他们的行为像常规字段,同样在名称A::varB::var也在其他答案中提到。

21

可以使用using关键字告诉编译器所使用的版本:

class Derived : public A, public B 
{ 
protected: 
    using A::word; 
}; 

这告诉Derived类有一个保护成员word,这将是一个别名A::word编译器。然后,无论何时使用Derived类中的非限定标识word,这将意味着A::word。如果你想使用B::word,你必须完全限定范围。

+0

难道你不得不说什么必须“使用”为A :: word吗?或者单独使用A :: word'就够了吗? – dhein

+0

@Zaibis这就够了,它基本上使'Derived :: word'成为'A :: word'的别名。 –

+0

我正在拜托你,因为我不习惯C++,因为我和C在一起;) – dhein