Наследование конструктора и деструктора - PullRequest
6 голосов
/ 12 ноября 2011

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

Ответы [ 5 ]

5 голосов
/ 12 ноября 2011

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

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

class Derived: public Base {};

Derived d(3);

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

1 голос
/ 12 ноября 2011

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

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

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

0 голосов
/ 12 ноября 2011

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

0 голосов
/ 12 ноября 2011

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

0 голосов
/ 12 ноября 2011

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

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

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