委托和调用父类构造函数:如何做到这两点?

Delegation and Calling Parent Class Constructors: How do I do both?

本文关键字:两点 何做 调用 父类 构造函数      更新时间:2023-10-16

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

// 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()两次。我不认为这是第二条,但我列出它只是为了涵盖所有的可能性。

我知道在c++中委托也有一点奇怪的属性,因为只要它的任何构造函数完成执行,类就被认为是构造的,即使你将调用委托给另一个构造函数,并且它还没有完成实际调用[/I]的调用。我不认为在这种情况下会有什么影响,但是值得一提。

我搜索了这个网站,用谷歌搜索了一下,但找不到确切的答案;我能找到的最接近的是在MSDN上没有在相同的初始化列表中进行委托和初始化。目前,我无法通过完全兼容c++ 11的编译器运行一些测试代码,所以我不能只是进行实验。如果你能帮忙,我将不胜感激。

选项#3是唯一有效的选项。你不能在同一个初始化列表中同时拥有基类初始化器和委托,原因与你不能同时拥有成员初始化器和委托相同:编译器怎么知道不初始化成员/基类两次呢?

这是唯一有效的选项:

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

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