c++如何扩展具有组合的类?

标签 c++ inheritance encapsulation composition

最近遇到了以下问题。我有一个基类,它有一个 Base_encapsulated_class。

class Base_class
{
public:
    Base_class(int int_value, short short_value) :
      m_encapsulated_class(int_value, short_value)
    {};

    ~Base_class(void){};

    Base_encapsulated_class  m_encapsulated_class;
};

class Base_encapsulated_class
{
public:
    Base_encapsulated_class(int int_value, short short_value)
        : m_int(int_value),
        m_short(short_value)
    {};

    ~Base_encapsulated_class(void){};

private:
    int m_int;
    short m_short;
};

现在我想扩展 Base_classBase_encapsulated_class 来实现:

class Derived_class : public Base_class
{
public:
    Derived_class(int int_value, short short_value, bool boolean_value) :
      Base_class(int_value, short_value)
    {};

    ~Derived_class(void)
    {};

    Derived_encapsulated_class m_encapsulated_class;

};

class Derived_encapsulated_class : public Base_encapsulated_class
{
public:
    Derived_encapsulated_class(int int_value, short short_value, bool boolean_value) :
      Base_encapsulated_class(int_value, short_value),
          m_bool(boolean_value)
    {
    }

    ~Derived_encapsulated_class(void)
    {
    }

private:
    bool m_bool;
};

这种方法在派生类对象中为我提供了 m_encapsulated_class 的两个实例,这在 c++ 中显然是合法的(我有点惊讶)。

但这不是我想要的。我希望派生类中有一个 m_encapsulated_class 成员。那么是否可以在基类中扩展复合成员呢?

最佳答案

您可以使用虚拟 getter 来强制继承成员:

class Base_class
{
public:
    Base_class(int int_value, short short_value) :
      m_encapsulated_class(int_value, short_value)
    {};

protected:
    virtual Base_encapsulated_class Get_encapsulated_class() /* = 0 if you want to enforce encapsulated derivation */
    {
       return m_encapsulated_class;
    }


private:
    Base_encapsulated_class  m_encapsulated_class;
};


class Derived_class : public Base_class
{
public:
    Derived_class(int int_value, short short_value, bool boolean_value) :
      Base_class(int_value, short_value)
    {};

    ~Derived_class(void)
    {};

protected:
    virtual Base_encapsulated_class Get_encapsulated_class() 
    {
       return m_derived_encapsulated_class;
    }

private:

    Derived_encapsulated_class m_derived_encapsulated_class;

};

关于c++如何扩展具有组合的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22470492/

相关文章:

namespaces - Polymer组件不封装javascript

c++ - std::tuple<> 中的参数包装然后应用

javascript - 是否可以扩展已经从另一个类继承的类?

c++ - 覆盖 - 如何用更少的打字来做到这一点?

c# - 速记访问器和修改器

javascript - 变量不保存新值

c++ - 使用 GMP 设置 Netbeans,如何指定编译选项?

c++ - 在 C++ 的 main() 函数中声明的类

c++ - float 和整数之间的不等式比较

vb.net - VB .Net 中是否可以进行多重继承?