Нет, они наследуются.Деструкторы, например, всегда наследуются и вызываются в порядке, обратном созданию.Например, если у нас есть классы 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)
.