2013-02-23 74 views
1
#include <iostream> 
using namespace std; 

class base{ 
public: 
    int i; 
    base(){ 
    i=1; 
    cout<<"Base Constructor"; 
    } 
}; 

class derived: private base{ 
    public: 
    derived(){ 
    i=2; 
    cout<<"Derived constructor"; 
    } 
}; 


int main(){ 
derived c; 
return 0; 
} 

對於上面的代碼,爲什麼我會得到輸出爲 「Base ConstructorDerived Constructor」 即使我繼承使用私有?我繼承了使用私人的構造函數,爲什麼我仍然可以從主函數訪問它?

+0

你期望什麼? – 2013-02-23 16:47:17

+0

只能派生構造函數 – Alex 2013-02-23 16:47:54

回答

3

爲什麼我仍然可以從主函數訪問它?

你不是。

您的主要功能訪問derived的構造函數,它有權訪問它。

derived的構造函數訪問base的構造函數,它的有權訪問。

1

構造函數在執行構造函數的主體之前自動初始化基類和成員。私有繼承不會改變這一點。它只是使班級的基礎部分不能在班級之外訪問。由於它是調用基類構造函數的派生類構造函數,所以私有繼承不會限制它可以執行的操作。

0

你的意思是做基類protected的構造函數。那麼只有派生類可以使用它:

class base 
{ 
protected: 
    base() : i(1) { } 
private: 
    int i; 
}; 

class derived : private base 
{ 
public: 
    derived() : base() { } 
}; 

int main() 
{ 
    // base b; // error: inaccessible constructor base::base() 
    derived d; // fine 
} 

一個有點流行的模式也使析構函數保護。不過,你明白了。

相關問題