2011-02-24 62 views
1
// Inheritance.cpp : main project file. 
#include "stdafx.h" 

using namespace System; 

ref class Base { 
private: 
    int value; 
    int value2; 
    Base() { this->value2 = 4; } 
protected: 
    Base(int n) { 
     Base(); // <- here is my problem 
     value = n; 
    } 
    int get(){ return value; } 
    int get2(){ return value2; } 
}; 

ref class Derived : Base { 
public: 
    Derived(int n) : Base(n) { } 
    void println(){ 
     Console::WriteLine(Convert::ToInt32(get())); 
     Console::WriteLine(Convert::ToInt32(get2())); 
    } 
}; 

int main(array<System::String ^> ^args) { 
    Derived ^obj = gcnew Derived(5); 
    obj->println(); 
    Console::ReadLine(); 
} 

控制檯輸出:C++構造函數,繼承,訪問修飾符和東西

0 
5 

我知道,我做調用基()構造函數,並且我知道我創造這樣一個新的對象,在Base(int n)被調用後消失...

但我不知道如何將我的私有默認構造函數與受保護的構造函數結合起來。

(我使用通過視覺工作室2010年的.NET框架,但我認爲這更像是一個普通的C++的問題)

+1

在C++中,您無法調用構造函數從一個構造函數:http://stackoverflow.com/questions/308276/c-call-constructor-from-constructor – birryree 2011-02-24 17:53:06

+0

感謝您的鏈接 – Baarn 2011-02-24 18:07:38

+1

@birryee:當然可以 - 但這樣做構造*另一個*對象,而不是委託 – 2011-02-24 18:32:53

回答

2

當我面對這種情況我增加了一個成員函數初始化共同的價值觀,比如兩個構造函數都調用了Init方法。

+0

好吧,似乎是最好的辦法然後(特別是當看我的問題下面的第一條評論) – Baarn 2011-02-24 18:06:24

2

使用方法
例如命名該方法init()

0

構造函數Base()離開value未初始化,我甚至不確定是否需要構造函數,因爲它是private

只要確保您充分定義了您的公共API並只創建所需的構造函數。然後在每個構造函數中使用初始化程序列表來分配所有屬性,以避免使用未初始化的內存(通常嘗試避免在主體中分配或單獨的方法以避免可能的雙重初始化)

+0

的目的Base()是爲了設定價值2,因爲它唯一的目的是t,所以它是私人的o只能由來自同一類的其他構造函數調用,如在這種情況下的Base(int n),這似乎是可悲的 – Baarn 2011-02-24 18:10:49