我是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函数中,我声明了一个派生对象,而没有构造函数的任何参数。会发生什么?有没有办法单独传递该对象的基础构造函数一个参数?
感谢。
答案 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时,它会调用派生类的析构函数。 并且最后删除所有对象,调用基类的析构函数。