委派和致电父类构造者:我如何做到这两点?

时间:2015-10-07 22:54:55

标签: c++ c++11 constructor

关于派生类构造函数的委派,我想知道一些事情。当你还必须调用父类时,什么是委托构造函数的正确方法。构造函数?我知道你不能在同一个初始化列表中同时进行委托和成员初始化,但我不知道是否要打电话给父母班级'构造函数具有相同的限制。

// Option 1: Call parent class constructor, then delegate:

class Foo {
    public:
        Foo(int);
};

class Bar : public Foo {
    public:
        Bar(int, float) : Foo(int), Bar(int, float, 'c');
        Bar(int, float, char);
};

// Option 2: Delegate, then call parent class constructor:

class Foo {
public:
    Foo(int);
};

class Bar : public Foo {
    public:
        Bar(int, float) : Bar(int, float, 'c'), Foo(int);
        Bar(int, float, char);
};

// Option 3: Primary constructor calls parent class constructor:

class Foo {
    public:
        Foo(int);
};

class Bar : public Foo {
    public:
        Bar(int, float) : Bar(int, float, 'c');
        Bar(int, float, char) : Foo(int);
};

我认为它不是#1或#3(很可能是#3),但我不确定;我知道它不是一个组合,因为那会两次调用Foo()。我不认为它是#2,但我列出它只是为了涵盖所有可能性。

我知道C ++中的委托也有一些奇怪的属性,因为即使你将调用委托给另一个构造函数,它也被认为是在构造完成后立即构造的。一个,它还没有完成实际上[i]称为[/ i]的那个。我不认为这会对这种情况有任何影响,但值得一提。

我搜索了网站并用Google搜索,但无法找到确切的答案;我能找到的最接近的是在MSDN上没有在同一初始化列表中进行委托和初始化的情况。我目前无法通过完全兼容C ++ 11的编译器运行某些测试代码,因此我无法进行实验。帮助将不胜感激。

提前致谢。

2 个答案:

答案 0 :(得分:4)

选项#3是唯一有效的选项。出于同样的原因,您不能在同一个初始化程序和委托中使用基本初始化程序和委托:编译器如何知道不会初始化成员/基数两次?

答案 1 :(得分:2)

这是唯一有效的选项:

class Bar : public Foo {
    public:
        Bar(int, float) : Bar(int, float, 'c') {}
        Bar(int, float, char) : Foo(int) {}
};

如果你的构造函数委托,那么它的mem-initializer-list只允许由单个委托构造函数调用组成。