为什么基类的构造函数方法被调用两次?

时间:2014-12-04 15:04:58

标签: c++ c++11

任何人都可以告诉我为什么基类的构造函数方法被调用两次?

#include <iostream>
using namespace std;

class A{
    public:
    A(){
        cout << "default constructor of base class" << endl;
    }
};

class B:public A{
    public:
    B(){
        A();
        cout << "default constructor of derived class" << endl;
    }
};

int main(int argc, char **argv){
    B b;
    return 0;
}

我得到了这个意想不到的结果:

default constructor of base class
default constructor of base class
default constructor of derived class

4 个答案:

答案 0 :(得分:15)

B中构建main对象的基础子对象:

B b;

A的构造函数中构建临时B对象:

A();

也许你打算初始化A子对象;在初始化列表中执行此操作,而不是构造函数体:

B() : A() {
    cout << "default constructor of derived class" << endl;
}

尽管如此,在这种情况下,完全相同的事情就完全不同了。

答案 1 :(得分:9)

基类构造函数被调用两次,因为你在derived-class ctor中创建了一个基类的临时对象。

您可能想要了解ctor-init-list。

答案 2 :(得分:3)

这将涉及对base的构造函数的两次调用。

1) In the derived initializer list.
2) Your explicit call.

即每个成员都在初始化列表中构建。如果您不能提供任何特定的构造函数,则使用默认构造函数。

答案 3 :(得分:0)

这是因为你直接在B里面调用A()。但是,在继承中,当未覆盖默认构造函数时,首先调用Base类的构造函数。

因此,只需删除B的构造函数中的A(),因为类A是Base,它的构造函数将首先被调用。