2011-02-24 47 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