如何在 C++ 中调用基类构造函数 [重复]

Posted

技术标签:

【中文标题】如何在 C++ 中调用基类构造函数 [重复]【英文标题】:How are base class constructors called in c++ [duplicate] 【发布时间】: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.) 现在假设基类构造函数采用参数化参数,但派生构造函数为空。在主函数中,我声明了一个派生对象,构造函数没有任何参数。会发生什么?有什么方法可以单独向该对象的基本构造函数传递参数?

谢谢。

【问题讨论】:

【参考方案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++ 没有问题。无论如何,在这里使用已经提出的构造函数转发将是正确的方法。

以上是关于如何在 C++ 中调用基类构造函数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量

基类构造函数参数值[重复]

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]

如何在 C++ 中调用基类的参数化构造函数?

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

C++中,继承时,创建子类对象,能否在子类构造函数初始化列表里调用基类构造函数?