Наследование конструктора и деструктора

Я верю Constructors а также Destructors в base class не может быть унаследовано derived classes базового класса. Правильно ли мое понимание.

5 ответов

Решение

Ваше понимание верно. Например, если у вас есть

class Base
{
  Base(int i) {}
};

class Derived: public Base {};

Derived d(3);

Это не скомпилируется, потому что конструктор Base не наследуется. Обратите внимание, что конструктор default и copy создаются по возможности компилятором и вызывают соответствующий конструктор базовых классов, поэтому для этих конструкторов это выглядит так, как если бы они были унаследованы.

Я думаю, это то, что вы ищете? Вы можете вызвать конструктор суперкласса, добавив в конструктор класса следующее

SubClass(int foo, int bar)
    : SuperClass(foo)

Полный пример можно найти здесь. Каковы правила вызова конструктора суперкласса?

Как объясняет этот вопрос, конструкторы не наследуются. То же самое относится и к деструкторам.

Нет, они наследуются. Деструкторы, например, всегда наследуются и вызываются в порядке, обратном созданию. Например, если у нас есть классы foo, bar а также xyzzy:

class foo { ... };
class bar : public foo { ... };
class xyzzy : public bar { ... };

Тогда, если вы дестой объект класса xyzzyДеструкторы будут вызываться в следующем порядке: ~xyzzy(), ~bar() и наконец ~foo(),

Конструкторы также всегда наследуются, но их нельзя вызывать напрямую. Вы должны использовать их в списке инициализации конструктора, иначе будет вызван конструктор по умолчанию (конструктор по умолчанию - это тот, который не принимает аргументов). Например, скажем, у нас есть следующие классы:

class foo {
public:
    foo();
    foo (int _value);
}

class bar : public foo {
    int m_value;

public:
    bar (int _value);
}

bar::bar (int _value)
{
    m_value = _value;
}

В этом случае, когда вы создаете объект класса barконструктор для foo вызывается, но это конструктор по умолчанию (foo()). Конструктор, который принимает аргумент foo (int _value) никогда не называется. Но если мы изменили определение bar (int _value) конструктор к этому:

bar::bar (int _value)
    : foo (256 - _value), m_value (_value)
{
}

Тогда вместо конструктора по умолчанию, foo (int _value) будет называться.

Напротив, каждый конструктор производного класса вызывает конструктор базового [супер-] класса. Каждый деструктор производного класса вызывается непосредственно перед деструктором базового [супер-] класса.

Наследование касается классов, а не функций или конструкторов.

Другие вопросы по тегам