Указатель на базовый класс в производном классе как переменная-член - PullRequest
1 голос
/ 16 апреля 2020

Я видел из кода, что у производного класса есть переменная-член, которая является указателем на его базовый класс, например

class Base {
private: 
    int a;
    int b;
    int d;
    void init(){// ... }
public:
    Base(int a_ , int b_) :  a(a_), b(b_){
     init();
    }
    Base() = default; 
    int getA(){return a;}

}


class Derived : public Base {
    private: 
       Base* base;
       int c; 
    public: 
       Derived(int a_, int b_, int c_): base(new(Base(a_, b_)), c(c_){base->getA() // for initialization of another function};
    }

int main(){

Derived derived(0,0,0); 
}

Это что-то умное? Почему или как это может быть полезно иметь элемент Base внутри производного класса, если мы можем просто вызвать publi c или защищенные методы Base из Derived?

Другой вопрос: я получаю дважды построенную базу , правильно? один для производного объекта, который вызывает конструктор по умолчанию, а другой из списка инициализации, который вызывает конструктор не по умолчанию.

Редактировать: Код, который я представляю, является ОЧЕНЬ короткой версией того, в что я вступил. Они используют элемент base в производном для выполнения множества задач, то есть вызова членов Base в качестве параметров для других функций или инициализации членов Derived. Я думаю, что это может быть только для инкапсуляции. Но это, конечно, странно.

Надеюсь, мой вопрос не слишком запутан! Я просто не понимаю, что могло бы быть в основе такого применения!

Ответы [ 2 ]

3 голосов
/ 16 апреля 2020

Полезность (или разумность) не может быть установлена ​​путем просмотра этого кода (если только это не является окончательной версией тех классов, в этом случае кажется бесполезным создавать экземпляр базового класса внутри производного класса, потому что он не используется), это зависит о том, как вы собираетесь использовать базовый объект внутри класса Derived.

Обратите внимание, что базовая переменная внутри класса Derived не имеет ничего общего с базовым классом, от которого наследуется класс Derived.

Объект экземпляра 2 кода один - это названный производный, который относится к классу Derived, другой - это базовый объект с именем внутри производного класса (создается с новым внутри производного конструктора).

Предупреждение: код выше, без определения деструктора для производного класса вызвать пропущенное удаление объекта базового класса при разрушении объекта производного класса.

1 голос
/ 16 апреля 2020

Да, у вас это построено 2 раза и даже больше: вы никогда не уничтожаете этот второй динамически распределенный класс. Это выглядит странно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...