为什么调用基构造函数?
问题描述:
好的,我有一个非常基本的问题,所以请对我轻松点。
在下面的代码:为什么调用基构造函数?
#include<iostream>
class base
{
public:
base() { std::cout << "Base()" << std::endl; }
};
class derived: base {
public:
derived() { std::cout << "Derived()" << std::endl; }
};
int main() {
derived d;
}
输出是:
基地()
派生()
我想知道为什么的构造base
尽管我正在创建derived
类的对象,但仍会调用类?我在FAQ
找不到合适的答案。
答
调用base
类的构造函数来初始化derived
中包含的类子对象base
。这就是继承是如何工作的,这使得更容易遵循Liskov substitution principle。
考虑以下几点:
class base
{
public:
base() : x(10) { std::cout << "Base()" << std::endl; }
private:
int x;
};
class derived: base {
public:
derived() { std::cout << "Derived()" << std::endl; }
};
你会如何初始化成员base::x
而不调用基类的构造函数的?
不过你要注意,当您使用虚拟继承你应该手动调用公共基础的构造。
+0
'virtual继承“ - 那就是现场。 – Sadique 2011-04-10 18:41:40
答
A Derived
对象应该始终能够用来代替Base
对象。如果Base
的私有成员需要正确初始化才能使用Base
,那可能是在构造函数中完成的,因此应始终调用Base
构造函数。
答
根据定义,派生对象也是的基础对象。
我首先阅读[this](http://www.desy.de/gna/html/cc/Tutorial/tutorial.html)。 – Mehrdad 2011-04-10 18:22:36
构造函数的目的是使对象可用。如果你没有调用基础构造函数,那么每个派生类都必须执行每个基类所需的每一个设置,以使对象可用......这与封装等不兼容。 – forsvarir 2011-04-10 18:24:02