如何在c ++中调用基类构造函数

时间:2014-06-05 10:55:29

标签: c++ inheritance constructor

我是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。)现在假设基类构造函数采用参数化参数,但派生的构造函数为空。在main函数中,我声明了一个派生对象,而没有构造函数的任何参数。会发生什么?有没有办法单独传递该对象的基础构造函数一个参数?

感谢。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您不需要在派生的构造函数中调用它。这是自动完成的 - 总是如此。 如果要显式调用构造函数,可以随时指定类名称空间和构造函数(应该是相同的),如下所示:

PointerToObject->ClassName::ClassName(Parameters);

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

答案 2 :(得分:0)

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

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

然后它将首先调用类b的构造函数然后调用c然后调用d。

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