【问题标题】:Get the path of inheritance from virtual base class从虚拟基类获取继承路径
【发布时间】:2014-07-26 10:52:41
【问题描述】:

我有如下代码sn-p,想知道c++编译器选择哪个路径来继承成员。

class B
{
    public:
    void display()
    {
        cout << "B";
    }
};

class B1 : virtual public B
{
};

class B2 : virtual public B
{
};

class C : public B1, public B2
{
};

int main()
{
    C c;
    c.display();
    getchar();
    return 0;
}

是否真的可以让编译器选择路径,如果有,请告诉。可能是一个基本问题,但请花一些时间。提前致谢。

【问题讨论】:

  • 见“钻石问题”
  • “哪条路径”是什么意思? B 被继承一次,所以所有的路径都是一样的。

标签: c++ inheritance virtual


【解决方案1】:

它不是由编译器选择的,它是由语言定义的。 B 是虚拟的,所以 C 正好有一个 B 基类。它的基类将按照BB1B2的顺序构造。

【讨论】:

  • 那么,您的意思是B的成员仅通过B继承,而不是从B1或B2继承。 B1 或 B2 将自己的成员仅继承给 C ?另外,像Class C : public B2, public B1这样的继承会按照B, B2, B1这个顺序构造吗?
  • B1 和 B2 实例都有一个 B 基实例,并且可以访问其成员 - 但它们是同一个实例。这就是虚拟的作用。是的,声明的顺序会影响构造顺序。如果您自己尝试一下(例如,在每个构造函数中写信给cout)或给自己找一本关于 C++ 的好书,您可能会发现这更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 2016-05-20
  • 1970-01-01
  • 2016-03-04
  • 2013-12-07
  • 1970-01-01
相关资源
最近更新 更多