Question

I have encountered the following problem recently. I have a Base class which has-a 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;
};

Now I would like to extend both the Base_class and the Base_encapsulated_class to achieve :

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;
};

This approach gives me two instances of m_encapsulated_class in the derived class object, which apparently is legal in c++ (I am bit surprised).

But this is not what I want. I want one m_encapsulated_class member in my derived class. So is it possible to extend the composite member in the base class?

Was it helpful?

Solution

You can use a virtual getter to enforce inheritance on members :

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;

};
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top