有以下代码:

#include <iostream>

class Bazowa
{
    int x;
public:
    Bazowa() : x(55){}
    Bazowa(int x_) : x(x_) {}
    void fun()
    {
      std::cout << x << "fun\n";
    }
};

class Pochodna1 : virtual public  Bazowa
{
public:
    Pochodna1() : Bazowa(101) {}
};

class Pochodna2 : virtual public  Bazowa
{
public:
    Pochodna2() : Bazowa(103) {}
};

class SuperPochodna : public Pochodna1, public Pochodna2
{
public:
    SuperPochodna() : {}
};


int main() {
    SuperPochodna sp;
    sp.fun();     // prints 55fun

    return 0;
}

执行该程序后,它将打印“55fun”。 Pochodna1和Pochodna2类中的构造函数调用发生了什么-它们被忽略了吗?为什么将Bazowa类的成员'x'设置为'55',而不是'101'或'103'?

最佳答案

虚拟基础构造函数总是从最终的叶子类中调用。虚拟基础的其他构造函数均未调用。在您的情况下,SuperPochodna()正在调用Bazowa(),并且不使用Bazowa(int)Pochodna1中的Pochodna2调用。

参见http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.14或仅谷歌“虚拟基础构造函数”。

10-07 17:33