基类构造函数

Base class constructor

本文关键字:构造函数 基类      更新时间:2023-10-16

我有以下情况(以下仅用于说明):

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添加额外的构造函数。

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

是正确的方式。您只能在member initializers list 中使用参数调用基本构造函数

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

第二种选择不起作用。

第一个备选方案是唯一可行的备选方案。派生类的构造函数将在基类的构造函数之后调用,因此您的第二个选项无效。

当然,现在的问题是这样做是否"正确"。因为可能你应该有两个派生类,而不是一个。我并不是说你所做的是错误的,这只是需要记住的。