что мы не можем наследовать от базового класса: почему? - PullRequest
0 голосов
/ 26 августа 2011

После окончания моего первого курса C ++ у меня есть несколько вопросов, которые я хотел бы прояснить для себя.

Мы не можем унаследовать следующее (стандарт C ++ не позволяет): конструктор, конструктор копирования, оператор присваивания и деструктор.Итак, если у нас есть:

    #include <iostream>
    using namespace std;

    class A
    {
    public:
        A() {cout << "CTOR of A" << endl;}
        ~A() {cout << "DTOR of A" << endl;}
        A (const A &) {cout << "Cctor of A" << endl;}
        A& operator =(const A& other) {/* some code */}
    };

    class B : public A
    {
        /* B's data members and methods */
    };

    int main()
    {
        /* code */
        return 0;
    }

, класс B не унаследует все четыре, но почему?Для конструктора - я думаю, что если B унаследует конструктор A, то вместо создания объекта большего размера (объект B, поскольку B наследует от A, тогда это будет объект большего размера), мы 'd создать меньший, без методов и элементов данных B.Я прав или нет?

А как насчет деструктора, конструктора копирования и оператора присваивания?Применимая выше причина (при условии, что это правильно) относится и к ним?

С уважением, Рон

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Множественное наследование - одна из причин, по которой вы не наследуете конструкторы. Конструкторы копирования не являются особенными в этом отношении.

struct B1 {
  virtual ~B1() {}
  B1(int a);
};

struct B2 {
  virtual ~B2() {}
  B2(int a);
};

struct D : public B1, public B2 {
};

Не ясно, какой из них подойдет в этом случае.

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

Вы можете и всегда должны определять виртуальный деструктор, если вы намерены наследовать от него.

class A {
public:
  virtual ~A() {cout << "DTOR of A" << endl;
};

Без виртуального у вас будет утечка памяти.

Как отмечалось другими, операторы присваивания будут наследоваться. У меня есть скрытое подозрение, что полезность унаследованного оператора присваивания будет ограничена.

Edit:

При дальнейшем чтении не виртуальный деструктор фактически не определено. На практике это просто проявляется как утечка памяти.

0 голосов
/ 28 августа 2011

Думайте об этом так: B - это специализированный тип A. (B не совсем A.) Таким образом, B может иметь еще несколько элементов данных, которые также необходимо создать / уничтожить.Это невозможно при использовании ctor, dtor и т. Д. Или, даже если у B больше нет элементов данных, это может привести к созданию / уничтожению другим способом.

Производные классы являются специализированными версиями базы.классы, таким образом, нуждающиеся в их собственном ctor / dtor.

0 голосов
/ 27 августа 2011

Конструкторы не наследуются. Все остальное есть. Думайте об этом так: наследование - это особый случай агрегации. То есть ваш пример равен

class A
{
...
}

class B
{
public:
  A a;
}

Здесь A сохраняет все свои свойства, но не предоставляет конструкторы для B. То же самое происходит при наследовании, ожидайте, что вам не нужно указывать a для обращения к содержимому A .

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