【问题标题】:How are base class constructors called in c++ [duplicate]如何在 C++ 中调用基类构造函数 [重复]
【发布时间】:2014-07-26 08:05:06
【问题描述】:

我是 C++ 新手 关于如何调用基本构造函数,我有 2 个疑问。

1.) 假设我的代码看起来有点像这样。

#include<iostream>
using namespace std;

class Base  {
public:
    Base()    { cout<<"Constructor: Base"<<endl; }
    virtual ~Base()   { cout<<"Destructor : Base"<<endl; }
};

class Derived: public Base {
public:
    Derived()   { cout<<"Constructor: Derived"<<endl; }
    ~Derived()  { cout<<"Destructor : Derived"<<endl; }
};

int main()  {
    Base *Var = new Derived();
    delete Var;
    return 0;
}

有人告诉我,在通过初始化列表定义派生构造函数之前,必须显式调用基本构造函数。 但是这里没有对基本构造函数的任何调用,代码按预期工作。

**The output for the above problem is**

Constructor: Base
Constructor: Derived
Destructor : Derived
Destructor : Base

2.) 现在假设基类构造函数采用参数化参数,但派生构造函数为空。在主函数中,我声明了一个派生对象,构造函数没有任何参数。会发生什么?有什么方法可以单独向该对象的基本构造函数传递参数?

谢谢。

【问题讨论】:

    标签: c++ inheritance constructor


    【解决方案1】:

    如果您想从Derived 调用的Base 构造函数不是默认值,只需使用初始化列表,例如:

    Derived::Derived() : Base(args) {
        // ...
    }
    

    【讨论】:

    • 那不叫“构造函数转发”吗?据我了解,初始化列表或“初始化程序列表”将是用于初始化实例的“花括号值列表”
    • @OleDittmann 特别是它被称为member initializer list,不要与list initialization 混淆,这是您的想法。
    【解决方案2】:

    首先调用基类的构造函数。之所以如此,是因为它是在派生类中继承的,所以调用构造函数的顺序就像是先继承的类,先调用它的构造函数,然后调用继承基类的类的构造函数。 举个例子吧

    class a: public b,public c,public d
     { ....
      }
    

    那么它会先调用b类的构造函数,然后是c,然后是d,然后是a。

    在析构函数的情况下,您已将基类的析构函数设为虚拟,因此当您编写 delete Var 时,它正在调用派生类的析构函数。 最后要删除所有对象,调用基类的析构函数。

    【讨论】:

      【解决方案3】:

      您不需要在派生的构造函数中调用基本构造函数。这是自动完成的 - 总是。 如果您想显式调用构造函数,您可以随时通过指定类命名空间和构造函数(应该相同)来执行此操作,如下所示:

      PointerToObject->ClassName::ClassName(Parameters);
      

      (但这被认为是“NoNo!” - 不好的风格,因为在良好设计的情况下它不应该是必需的)

      【讨论】:

      • 嗯...真的吗? ;-P 请参阅 ideone.com 的代码示例 here,或者您的意思是否不同...?
      • 嗯,好的,VisualC++ 没有问题。无论如何,在这里使用已经提出的构造函数转发将是正确的方法。
      猜你喜欢
      • 2019-06-10
      • 1970-01-01
      • 2010-10-12
      • 2020-09-22
      • 1970-01-01
      • 2012-09-28
      • 2017-02-04
      • 2013-03-24
      • 2021-05-30
      相关资源
      最近更新 更多