关于派生类构造函数的委派,我想知道一些事情。当你还必须调用父类时,什么是委托构造函数的正确方法。构造函数?我知道你不能在同一个初始化列表中同时进行委托和成员初始化,但我不知道是否要打电话给父母班级'构造函数具有相同的限制。
// 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的编译器运行某些测试代码,因此我无法进行实验。帮助将不胜感激。
提前致谢。
答案 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只允许由单个委托构造函数调用组成。