任何人都可以告诉我为什么基类的构造函数方法被调用两次?
#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
答案 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,它的构造函数将首先被调用。