Наследование конструктора и деструктора
Я верю 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)
будет называться.
Напротив, каждый конструктор производного класса вызывает конструктор базового [супер-] класса. Каждый деструктор производного класса вызывается непосредственно перед деструктором базового [супер-] класса.
Наследование касается классов, а не функций или конструкторов.