2011-04-10 161 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

根據定義,派生對象也是的基礎對象。

相關問題