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

Why aren't C++ constructors inherited?

本文关键字:构造函数 C++ 继承 为什么不      更新时间:2023-10-16

为什么在这段代码中需要子传递构造函数?我认为它不会,但编译器(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的构造函数,那么您必须显式调用它。