2013-02-13 69 views
2

我有以下的情况(以下仅用于说明):基类构造

class Base() 
{ 
public: 
    Base(int); 
}; 

class Derived : public Base 
{ 
public: 
    Derived(int, int, bool); 
}; 

我想初始化取决于布尔标志在派生构造的基类。什么(如果有的话)是这样做的正确的方式..

我可以做(但基地做过评估被初始化):

Derived::Derived(int _x, int _y, bool _z) : Base(_z?_x:_y) {} 

或(但这可能无法正常工作正确)

Derived::Derived(int _x, int _y, bool _z) 
{ 
    if(_z) 
     ::Base(_x); 
    else 
     ::Base(_y); 
} 

如果这样做,那么我可能与添加额外的构造函数来Derived脱身的不正确的方法。

+2

第一个解决方案是正确的(使用三元运算符)。如果你有一个更复杂的初始化来计算Base参数的值,你可以使用一个(free或not)函数调用('Derived :: Derived(int _x,int _y,bool _z):Base(compute_value()) {}') – utnapistim 2013-02-13 10:44:19

+0

'class Base()'是错误的,请移除parens。你提出的第一个提议是好的,评估将在调用'Base()'构造函数之前完成。 – 2013-02-13 10:47:14

+1

第二个,在'if'的每个分支中,创建一个'Base'类型的临时对象并立即销毁它。 – 2013-02-13 13:33:53

回答

2

你的第一个选择是正确的:使用初始化列表。

第二个选择不起作用。

3
Derived::Derived(int _x, int _y, bool _z) : Base(_z?_x:_y) {} 

是正确的方法。 您只能通过参数调用基础构造函数member initializers list

2

第一个选择是唯一可以工作的替代方案。派生类的构造函数将在基类的构造函数之后调用,因此第二个选项无效。

当然,问题是这是否是“正确”的事情。因为它可能是你应该有两个派生类,而不是一个。我并不是说你在做什么是错误的,它只是需要记住的一点。