19
class A
{
   protected:
    string word;
};

class B
{
   protected:
    string word;
};

class Derived: public A, public B
{

};

变量的可访问性将如何word受到影响Derived?我将如何解决它?

4

4 回答 4

35

这将是模棱两可的,你会得到一个编译错误。

您需要使用正确的范围来使用它:

 class Derived: public A, public B
{
    Derived()
    {
        A::word = "A!";
        B::word = "B!!";
    }
};
于 2013-11-04T08:25:02.600 回答
26

您可以使用using关键字告诉编译器使用哪个版本:

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

这告诉编译器Derived该类有一个受保护的成员word,它将是 的别名A::word。那么每当你wordDerived类中使用不合格的标识符时,它就意味着A::word. 如果你想使用B::word你必须完全限定范围。

于 2013-11-04T08:30:36.557 回答
5

您的班级Derived将有两个变量,B::word并且您可以像这样A::word在外部Derived访问它们(如果您将它们的访问权限更改为公共):

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

尝试访问c.word将导致错误,因为没有名称为 的字段word,而只有 A::word 和 B::word。

在内部Derived,它们的行为再次像常规字段一样,带有名称A::var,并且B::var在其他答案中也提到过。

于 2013-11-04T08:26:46.030 回答
3

word在类中访问时Derived,您必须声明

class Derived: public A, public B
{
    Derived()
    {
       A::word = X;
       //or
       B::word = x;
    }
};
于 2013-11-04T08:24:50.650 回答