是否有时候在C ++中没有调用超类的构造函数?

时间:2011-04-27 21:42:38

标签: c++ inheritance constructor

这个问题让我接受采访。如果B是A的子类。在构造B时,是否有时候没有调用A的构造函数?

编辑:我告诉采访者我无法想到这种情况,因为我认为只有在构造子类之前才能正确构造超类才有意义。

5 个答案:

答案 0 :(得分:6)

一个可能的实例是,AB都没有用户声明的构造函数,而B的实例正在值初始化

AB都隐式声明了不会在初始化中使用的构造函数。

同样,如果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的构造函数尚未被调用的时期。