【问题标题】:Base class constructor基类构造函数
【发布时间】:2013-02-13 10:42:15
【问题描述】:

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

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

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

我想根据派生构造函数中的布尔标志来初始化基类。这样做的正确方法是什么(如果有的话)..

我可以做(但评估是否在 Base 初始化之前完成?):

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

【问题讨论】:

  • 第一个解决方案是正确的(使用三元运算符)。如果您有更复杂的初始化来计算 Base 参数的值,您可以使用(免费或不免费)函数调用 (Derived::Derived(int _x, int _y, bool _z) : Base( compute_value() ) {})
  • class Base() 错误,删除括号。您提出的第一个提案很好,将在调用 Base() 构造函数之前进行评估。
  • 第二个,在if的每个分支中,创建一个Base类型的临时对象并立即销毁它。

标签: c++ constructor


【解决方案1】:
 Derived::Derived(int _x, int _y, bool _z) : Base(_z?_x:_y) {}

是正确的方法。 您只能在member initializers list 中调用带有参数的基本构造函数@

【讨论】:

    【解决方案2】:

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

    第二种方法不起作用。

    【讨论】:

      【解决方案3】:

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

      当然,现在的问题是这是否是“正确”的做法。因为您可能应该有两个派生类,而不是一个。我并不是说您所做的事情本身就是错误的,这只是要记住的事情。

      【讨论】:

        猜你喜欢
        • 2016-07-19
        • 2018-07-21
        • 1970-01-01
        • 2015-08-18
        • 2018-07-16
        • 1970-01-01
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多