【问题标题】:Multiple Inheritance: same variable name多重继承:相同的变量名
【发布时间】:2013-11-04 08:21:10
【问题描述】:
class A
{
   protected:
    string word;
};

class B
{
   protected:
    string word;
};

class Derived: public A, public B
{

};

变量word 的可访问性在Derived 中会受到怎样的影响?我该如何解决?

【问题讨论】:

  • 请注意,除了下面的好答案之外,尽可能避免这种名称冲突始终是一个好策略。

标签: c++ multiple-inheritance


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    这告诉编译器Derived 类有一个受保护的成员word,它将是A::word 的别名。然后,每当您在Derived 类中使用非限定标识符word 时,它将表示A::word。如果你想使用B::word,你必须完全限定范围。

    【讨论】:

    • 您不必说 A::word 必须“使用”什么吗?还是 using A::word 一个人就够了?
    • @Zaibis 真的够了,它使Derived::word 成为A::word 的别名,基本上。
    • 我相信你,我只是问,因为我不像 C 那样习惯 C++。;)
    • using A::word 在一个完整的句子中是:“编译器,当我在下面的子句中谈论word 时,我的意思是A::word
    【解决方案3】:

    您的类Derived 将有两个变量,B::wordA::wordDerived 之外,您可以像这样访问它们(如果您将它们的访问权限更改为公共):

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

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

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

    【讨论】:

      【解决方案4】:

      当在Derived的类中访问word时,你必须声明

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        • 1970-01-01
        • 2013-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-21
        相关资源
        最近更新 更多