这个问题让我接受采访。如果B是A的子类。在构造B时,是否有时候没有调用A的构造函数?
编辑:我告诉采访者我无法想到这种情况,因为我认为只有在构造子类之前才能正确构造超类才有意义。答案 0 :(得分:6)
一个可能的实例是,A
和B
都没有用户声明的构造函数,而B
的实例正在值初始化。
A
和B
都隐式声明了不会在初始化中使用的构造函数。
同样,如果A
没有用户声明的构造函数,但出现在B
的构造函数的成员初始值设定项列表中,但初始化程序为空,则A
将 value-使用B
的构造函数时初始化。同样,因为A
没有用户声明的构造函数,所以 value-initialization 不使用构造函数。
答案 1 :(得分:5)
我想你可以做一些在B的初始化列表中为A的非默认构造函数生成参数时抛出异常的东西吗?
您可以在下面看到A的构造函数从未被调用,因为参数生成中发生异常
#include <iostream>
using namespace std;
int f()
{
throw "something"; // Never throw a string, just an example
}
class A
{
public:
A(int x) { cout << "Constructor for A called\n"; }
};
class B : public A
{
public:
B() : A(f()) {}
};
int main()
{
try
{
B b;
}
catch (const char* ex)
{
cout << "Exception: " << ex << endl;
}
}
答案 2 :(得分:2)
虚拟继承。
struct B {...};
struct D1 : virtual B {...};
struct D2 : virtual B {...};
struct Child : D1, D2 {...};
通常构造函数B()
应该被调用两次,但它只会被调用一次。
答案 3 :(得分:0)
在A完全构建之前,B的构造甚至无法开始,所以答案是否。
答案 4 :(得分:0)
如果B有一个在A之前构造的第二个超类,那么将会有一个A的构造函数尚未被调用的时期。