【问题标题】:C++ inheritance constructor from base class [duplicate]来自基类的C ++继承构造函数[重复]
【发布时间】:2014-03-01 16:14:57
【问题描述】:
class SuperClass
{
public:

    SuperClass(int foo)
    {
        // do something with foo
    }
};

class SubClass : public SuperClass
{
public:

    SubClass(int foo, int bar)
    : SuperClass(foo)    
    {
        // do something with bar
    }
};

子类是否继承了超类的构造函数? 它继承了什么以及为什么我需要在子类构造函数中指定: SuperClass(foo)

【问题讨论】:

标签: c++ oop inheritance


【解决方案1】:

子类是否继承了超类的构造函数?

是的

它继承了什么以及为什么我需要在子类构造函数中指定:SuperClass(foo)?

因为你的 SuperClass 不提供默认构造函数(带参数),编译器不知道如何构造 SuperClass 对象,你必须告诉他 foofoo

【讨论】:

  • 你能解释一下你的最后一个答案吗?编译器不知道是什么意思?
  • 简单地说,你在 SuperClass 中有一个构造函数,它接受一个参数,在构造 SubClass 对象时你必须调用它,但是在 SuperClass 构造函数中应该将什么值传递给foo 参数并不明显如果您有一个默认构造函数(没有其他构造函数),那么编译器很明显会使用它以及如何调用
【解决方案2】:

SubClass 不继承构造函数。例如,您不能像使用继承的函数那样只调用 SuperClass 的构造函数之一。

SubClass 是由您的继承定义的SuperClass。因此,要成为SuperClass,它不仅要创建自己,还要创建SuperClass
这是使用构造函数完成的。而且由于您没有定义默认构造函数(没有参数的构造函数),编译器无法知道要调用哪个构造函数。这就是为什么您需要显式编写SubClass 应该使用哪个构造函数来创建SuperClass

【讨论】:

    【解决方案3】:

    不,子类不会“继承”基类构造函数。语法确实相似,但含义却大不相同。正在发生的事情是子类的构造函数首先初始化其超类对象的内部副本。您必须手动指定它的原因是因为基类可能有不同的构造函数,您可能希望使用特定参数调用某个子类构造函数。

    【讨论】:

      【解决方案4】:

      没有构造函数不被继承,你需要使用 :SuperClass(foo) 因为你试图将参数传递给基类构造函数。即使你没有指定编译器,也要确保基类默认构造函数(零参数构造函数)是当派生类对象创建时调用。 但是在您的情况下,您还没有定义零参数构造函数。请确保在删除 ':SuperClass(foo)' 之前定义它!!!

      【讨论】:

        【解决方案5】:

        构造函数不是继承的,但它们必须被调用。

        如果您的基类具有默认构造函数,那么如果您未指定替代方法,派生类将自动为您调用它。您必须指定对基类构造函数的调用的原因是,该类指定它必须用整数初始化,并且作为派生类,您有责任确保正确初始化基类。

        【讨论】:

          猜你喜欢
          • 2011-05-31
          • 2014-08-21
          • 1970-01-01
          • 1970-01-01
          • 2015-08-22
          • 1970-01-01
          • 1970-01-01
          • 2015-05-25
          • 1970-01-01
          相关资源
          最近更新 更多