为什么不继承C++构造函数?
Why aren't C++ constructors inherited?
为什么在这段代码中需要子传递构造函数?我认为它不会,但编译器(gcc和VS2010)抱怨当我删除它。是否有一个优雅的解决方案?似乎没有必要在子类中插入这个控件。
class Parent
{
public:
Parent(int i) { }
};
class Child : public Parent
{
public:
Child(int i) : Parent(i) { }
};
int main()
{
Child child(4);
return 0;
}
因为以下是完全有效的:
class Parent
{
public:
Parent(int i) { }
};
class Child : public Parent
{
public:
Child() : Parent(42) { }
};
编译器是如何猜测你是否想要派生的孩子有一个转发构造函数?在多重继承的情况下,两种类型的构造函数集合可能不匹配;当从基类a转发构造函数时,应该调用基类B上的哪个构造函数?
从技术上讲,我想语言设计者可能会说,如果类型有一个基类,并且没有显式构造函数,那么所有的父构造函数都被转发。然而,这会产生相反的问题:如果一个基类有多个构造函数,包括一个默认构造函数,而子类希望只允许默认构造函数,那么现在必须显式指定。
如果你没有明确指定应该调用哪个父构造函数,编译器将生成调用默认(无参数或所有默认值)构造函数的代码。
在你的例子中,类Parent
没有这样的构造函数,编译器将不知道为i
使用什么值。
没有在Child
类中指定构造函数意味着将调用Parent
类中的默认构造函数,但这并不存在。
我还没有尝试过,但是可以看看c++ 0x FAQ的这一部分。我觉得你的要求在c++ 0x中是可以实现的。
这是因为在c++中你有多重继承。在下面的例子中,应该继承哪个构造函数?
class Parent1
{
public:
Parent1(int i) { }
};
class Parent2
{
public:
Parent2(int i) { }
};
class Child : public Parent1, public Parent2
{
};
是否有一个优雅的解决方案?
从c++ 11开始,你可以使用using声明从基类继承构造函数(不包括default、copy或move构造函数):
class Parent
{
public:
Parent(int i) { }
};
class Child : public Parent
{
public:
using Parent::Parent; // inherits Parent(int)
};
int main()
{
Child child(4);
return 0;
}
这是另一个例子
class Parent
{
public:
Parent(int i) {this.i = i; }
Parent() {this.i = 0;}
private:
int i;
};
class Child : public Parent
{
public:
Child(int i) : { }
};
int main()
{
Child child(4);
return 0;
}
给定,应该调用哪个Parent
构造函数。如果Parent
定义了一个接受long
而不接受int
的构造函数,该怎么办?编译器应该自动将int
转换为long
吗?
无论好坏,语言设计者选择了简单性——从派生类自动调用的唯一构造函数是默认构造函数(无参数或所有参数都有默认)。
编译器只自动生成默认构造函数,即不带参数的ctr,但前提是您没有定义任何构造函数。
在这种情况下,你有(在父元素中),所以没有为你做默认值,加上子元素需要它,这样它就知道如何处理你传递给它的参数i
构造函数需要由子构造函数显式调用,如果你不想使用由编译器生成的默认构造函数,它被称为默认构造函数(没有参数)。但显然,在您的情况下,您需要一个接受int
的构造函数,那么您必须显式调用它。
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- 奇怪的构造函数行为