C++ C+中的多级继承+;

C++ C+中的多级继承+;,c++,oop,C++,Oop,假设我有一个基类a,类B就是从中派生出来的。C类来自B类等等。。。。。 Y从Z开始 当我实例化类Z时,谁将负责初始化类A的数据成员?当您从类继承时,基类的构造函数在派生类的构造函数之前被调用。您可以使用初始值设定项列表控制传递给它的内容: struct A { A(); A(int); } struct B { B(){} // A() is called implicitly. B(int x) : A(x) {} // A(int) is called ex

假设我有一个基类a,类B就是从中派生出来的。C类来自B类等等。。。。。 Y从Z开始


当我实例化类Z时,谁将负责初始化类A的数据成员?

当您从类继承时,基类的构造函数在派生类的构造函数之前被调用。您可以使用初始值设定项列表控制传递给它的内容:

struct A
{
    A();
    A(int);
}

struct B
{
    B(){} // A() is called implicitly.
    B(int x) : A(x) {} // A(int) is called explicitly.
}

根据数据成员的可访问性,沿链派生的任何类都可以负责初始化数据成员


一种常见的方法是为数据成员提供类A的构造函数需求值。类B会将这些变量添加到它的构造函数中,依此类推。

它可以是A到Z的任何一个类,这完全取决于您的情况。如果类A在其构造函数中接受参数AB和c,那么类b必须提供这些参数,如果类A在其构造函数中反过来希望传递参数BC,那么它将由类c提供这些参数,以此类推。子类可能会选择提供一个尚未在构造函数中传递的值,因此后续子类将不再需要提供该值。

好的,A的构造函数将负责初始化A的数据成员,因为类是自上而下构造的,或者在派生之前是基的。这就是为什么不能在构造函数中使用纯虚拟成员函数,因为定义它的派生类尚未创建。

每个类的每个构造函数都构造所有直接的非虚拟基类。这递归地解释了设置中发生的情况

相反,虚拟基类是由最派生类的构造函数构造的

下面是一个典型示例,其中明确提到了基本构造函数:

struct A { A(int, int) { /* ... */ ; };

struct B : A { B(char, bool) : A(2, 3) { /* ... */ };

struct C : B { C() : B('x', false) { /* ... */ };

C c;  // calls A::A(2, 3), then B::B('x', false), then C::C()

答案取决于A的直接继承是虚拟的还是非虚拟的。您能告诉我这两种情况下的答案吗?我只是在想,很好奇。对于非虚拟继承,它是类B。这是通常的情况,很简单。但是从一个对象继承
virtual
的所有继承链都共享同一个子对象,因此在初始化该部分的人方面可能存在一些冲突。C++中的规则是由最派生类,即z来完成。