2011-04-10 197 views
2

好的,我有一个非常基本的问题,所以请对我轻松点。
在下面的代码:为什么调用基构造函数?

#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找不到合适的答案。

+0

我首先阅读[this](http://www.desy.de/gna/html/cc/Tutorial/tutorial.html)。 – Mehrdad 2011-04-10 18:22:36

+1

构造函数的目的是使对象可用。如果你没有调用基础构造函数,那么每个派生类都必须执行每个基类所需的每一个设置,以使对象可用......这与封装等不兼容。 – forsvarir 2011-04-10 18:24:02

回答

7

调用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

3

A Derived对象应该始终能够用来代替Base对象。如果Base的私有成员需要正确初始化才能使用Base,那可能是在构造函数中完成的,因此应始终调用Base构造函数。

5

根据定义,派生对象也是的基础对象。

相关问题