委托和调用父类构造函数:如何做到这两点?
Delegation and Calling Parent Class Constructors: How do I do both?
我想知道一些事情,关于派生类构造函数的委托。当您还必须调用父类的构造函数时,委托构造函数的正确方法是什么?我知道你不能在同一个初始化器列表中同时进行委托和成员初始化,但我不知道调用父类的构造函数是否有相同的限制。
// 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只允许由单个委托构造函数调用组成。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 我想做一个彼此不同但重复出现的数字
- Python中的for循环与C++有何不同
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 用C++程序计算圆锥体的体积、球体的体积、八边形的面积和两点之间的距离
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么C++的文件 I/O 在读取文本文件时忽略初始空行?我怎样才能让它不这样做?
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 当我们为(;;) 写作时,它做了什么?for 循环中的双分号有什么作用?
- 我是 c++ 的新手.学习基本知识后,我想做井字游戏.对于印刷板,我在下面写代码,但它显示错误
- 为什么在C++中对链表这样做?(像堆叠一样处理它们)
- 我的C++线程做错了什么?
- 我不知道这条线是做什么的
- 这个模板在做什么?
- "delete"在 C++ 中实际上做了什么?
- 我怎么做两点之间的碰撞检查呢?(c++)