关于构造商的呼叫和继承顺序的混乱
Some confusion about the order of constructor call and inheritance
我有以下代码:
class A {
public:
A() { cout << "A-C" << endl; }
~A(){ cout << "A-D" << endl; }
};
class B {
public:
B() {
cout << "B-C" << endl;
}
~B() {
cout << "B-D" << endl;
}
};
class C {
protected:
A* a;
B b;
public:
C() {
a = new A;
cout << "C-C" << endl;
}
~C() {
delete a;
cout << "C-D" << endl;
}
};
class D : public C {
protected:
A a;
B b;
public:
D(){ cout << "D-C" << endl; }
~D(){ cout << "D-D" << endl; }
};
int main() {
D* d = new D;
B* b = new B;
delete b;
delete d;
system("pause");
return 0;
}
我对输出的最初想法是:
A-C
C-C
A-C
B-C
D-C
B-C
B-D
D-D
B-D
A-D
A-D
C-D
但这是错误的。输出实际上是:
B-C
A-C
C-C
A-C
B-C
D-C
B-C
B-D
D-D
B-D
A-D
A-D
C-D
B-D
我不知道为什么该程序首先将其称为B的构造函数及其破坏者。我认为构造函数呼叫的顺序应该这样:C的构造函数 -> a的构造函数 -> b的构造函数 -> d的构造函数。
destructor调用的顺序是构造函数调用的相反顺序
任何人都可以告诉我为什么B在开头调用B的构造函数,而B的destuructor终于被调用了?
B-C
A-C
C-C
A-C
B-C
D-C
所有这些都是由D* d = new D;
引起的。
D
构造函数调用C
构造函数,因为C
是D
的基础。
然后,C
类的数据成员a
和b
是初始化的,a
是一个指针,因此尚无构造函数调用该数据成员。b
是类型B
的对象,因此B
无参数构造器被调用,为您提供第一个B-C
。
然后在C
构造函数中您说的new A
调用A
的构造函数,该构造器为您提供A-C
,其次是C-C
。
然后,DATA成员a
和D类的b
都是初始化的,两个都是对象,因此两个构造函数都被称为对象,从而为您提供A-C
和B-C
。
最后,D
构造函数被称为,用D-C
结束。
相关文章:
- CPP 继承虚拟方法解析顺序
- 继承和例外中的C'tor/D'tors的顺序
- 关于构造商的呼叫和继承顺序的混乱
- 在继承中更改构造函数的顺序
- 在虚拟继承中构造函数调用的顺序是什么
- 为什么异常捕获是基于顺序的,而不是基于最接近继承的
- c++:多态性+多重继承顺序.继承顺序是否重要
- C++继承和初始化顺序
- 为什么继承顺序或映射会影响 vftable 的下标?(对于 VSC 表示C++)
- 继承顺序C++以何种方式影响构造函数
- 使用继承时构造函数/析构函数调用的顺序
- c++多继承顺序和虚函数
- 改变继承顺序会产生不同的结果
- 多重继承时的执行顺序
- c++中的继承:构造顺序
- 继承层次结构:构造函数和析构函数执行顺序
- 类和接口之间的继承顺序重要吗?
- 函数解析中使用的多重继承顺序
- 在继承中调用构造函数的顺序
- "Missing non-virtual thunks"和继承顺序