c++ - 这个初始化列表是如何使用虚类实现的呢?

标签 c++ virtual

#include<iostream.h>  
class A{  
  public:  
        int i;  
            A(int j=3):i(j){}  
};  
class B:virtual public A{  
  public:  
        B(int j=2):A(j){}  
};  
class C:virtual public A{  
  public:  
        C(int j=1):A(j){}  
};  
class D:public B, public C {    
  public:  
        D(int j=0):A(j), B(j+1), C(j+2){}  
};

int main()  
{  
    D d;   
    cout<<d.i;  
    return 0;
}

我无法理解最终输出为何为零。每次以默认方式将 j 初始化为某个固定值时,如何将类 D 的构造函数中初始化的值传递给类 A?

最佳答案

由于A是一个虚基类,它应该只构造一次,所以不可能用不同的构造函数参数创建它,C++编译器必须选择一种创建基类的方式。

显而易见的问题是:使用哪个?

规则是:直接继承A的最派生类中指定的。

初始化顺序很简单:首先是A(参数值来自D的构造函数初始化列表),然后是B(它是D的第一个祖先;它使用之前创建的A的实例),然后是C(它共享相同的 A 实例),最后是 D(并且它还与 B 和 C 共享相同的 A 对象)。

关于c++ - 这个初始化列表是如何使用虚类实现的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180243/

相关文章:

c++ - C++ 中的 "As a rule of thumb, make all your methods virtual"- 合理的建议?

c++ - Winapi 设置事件选项卡控件

c++ - 为什么我将垃圾值作为输出?

c++ - `cin >> variable` 不等待输入

c++ - 如何声明一个类显式抽象?

C++ - 覆盖虚函数和多态性

c++ - 为什么 std::unary_function 不包含虚拟析构函数

c++ - 迭代的 "range-based for"调用是什么

c++ - 无锁竞技场分配器实现 - 正确吗?

Java 和虚拟内存 : Controlling/influencing which objects are kept in main memory?