【问题标题】:What gets constructed first?首先构建什么?
【发布时间】: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


【解决方案1】:

构造函数的顺序是:

基 - 成员 - 派生

【讨论】:

  • 在这种情况下什么是“派生”?它与“会员”有何不同?构造函数主体在哪里适合?这个答案似乎非常不清楚和不完整。编辑:由于问题是关于构造顺序的,最好还指定基本类型和成员的构造顺序,因为顺序是由语言指定的,特别是对于数据成员,它可能不直观。
猜你喜欢
  • 1970-01-01
  • 2012-03-04
  • 2017-03-02
  • 1970-01-01
  • 2018-01-02
  • 2013-07-23
  • 2019-05-30
  • 1970-01-01
  • 2017-12-21
相关资源
最近更新 更多