为什么C++构造函数不继承?

plo*_*ong 5 c++ inheritance constructor

为什么在此代码中必须使用Child传递构造函数?我认为它不会,但编译器(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;
}
Run Code Online (Sandbox Code Playgroud)

Sve*_*ven 12

因为以下内容完全有效:

class Parent
{
public:
    Parent(int i) { }
};

class Child : public Parent
{
public:
    Child() : Parent(42) { }
};
Run Code Online (Sandbox Code Playgroud)

编译器如何猜测您是否希望派生子进程具有转发构造函数?在多重继承的情况下,两种类型的构造函数集可能不匹配; 从基类A转发构造函数时,应该调用基类B上的构造函数?

从技术上讲,我认为语言设计者可以说,如果类型有一个基类,并且没有显式构造函数,则转发所有父构造函数.但是,这会产生相反的问题:如果基类有多个构造函数,包括默认构造函数,并且子程序只希望允许默认构造函数,那么现在必须明确指定它.


And*_*ner 5

如果您未明确指定应显式调用哪个父构造函数,编译器将生成调用默认(无参数或具有所有默认值)构造函数的代码。

在您的情况下,该类Parent没有这样的构造函数,编译器不知道要使用什么值i

不在类中指定构造函数Child意味着Parent将调用类中的默认构造函数,但这并不存在。


我还没有尝试过,但请查看C++0x FAQ 的这一部分。我的印象是你所要求的在 C++0x 中是可能的。