【发布时间】:2011-11-24 06:05:46
【问题描述】:
关于创建对象的一个小问题。假设我有这两个类:
struct A{
A(){cout << "A() C-tor" << endl;}
~A(){cout << "~A() D-tor" << endl;}
};
struct B : public A{
B(){cout << "B() C-tor" << endl;}
~B(){cout << "~B() D-tor" << endl;}
A a;
};
在main中我创建了一个B的实例:
int main(){
B b;
}
请注意,B 派生自 A,并且还有一个类型为 A 的字段。
我正在尝试找出规则。我知道在构造对象时首先调用它的父构造函数,反之亦然。
字段(在这种情况下为A a;)呢?当B被创建时,什么时候会调用A的构造函数?我还没有定义初始化列表,是否有某种默认列表?如果没有默认列表?还有关于破坏的同样问题。
【问题讨论】:
-
如果您的析构函数消息与构造函数消息不同,您的示例可能更易于解释。还有,那些
std::sort在做什么? -
另外,在实验时,比较
B b、B* b = new B(); delete b;和A* a = new b(); delete a;的构造和销毁(比较当你使用virtual关键字作为你的析构函数时会发生什么,即virtual ~A() {cout<<"A D-tor"<<endl;}) -
@Tom,你是对的。删除编译器错误。
-
我已经编辑了您问题中的代码,以便这四种方法都打印不同的消息。现在,您自己要做的就是实例化 B 并观察标准输出。如果这不是您真正的意思,请查看并回滚。
标签: c++ constructor order-of-execution call-hierarchy