【发布时间】:2019-05-19 01:52:12
【问题描述】:
我只是想知道这里的构造顺序。 这里首先要构造的是InstanceOfA`还是B的构造函数已经调用了A?
class A {
public:
A() { cout << "A ctor" << endl; }
A(const A& a) { cout << "A copy ctor" << endl; }
virtual ~A() { cout << "A dtor" << endl; }
virtual void foo() { cout << "A foo()" << endl; }
virtual A& operator=(const A& rhs) { cout << "A op=" << endl; }
};
class B : public A {
public:
B() { cout << "B ctor" << endl; }
virtual ~B() { cout << "B dtor" << endl; }
virtual void foo() { cout << "B foo()" << endl; }
protected:
A mInstanceOfA; // don't forget about me!
};
int main() {
B X;
}
【问题讨论】:
-
这是你应该能够自己弄清楚的事情,只需向A的构造函数添加一些参数,比如
int,将其包含在消息中,然后传递一个不同的@987654323 @ 到A的每个实例。 -
在构造具有成员和单个基类的派生类时,首先调用/调用基构造函数,然后是成员的构造函数,然后是派生构造函数。
-
那么它的基础-成员-派生?
-
不,这并不完全正确。构造函数总是首先被调用。现在,构造函数可能在构造函数的主体被调用之前默认初始化类成员,或者它可能最终根据构造函数的initializer-list初始化类成员。你的 C++ 书籍应该对什么是初始化列表以及它们如何指导类成员的构造有完整的解释。
-
@SamVarshavchik - 构造函数初始化列表会影响调用成员和基的构造函数。它们不会影响调用这些构造函数的顺序。
标签: c++ oop polymorphism