Есть ли время, когда конструктор суперкласса не вызывается в C ++? - PullRequest
7 голосов
/ 28 апреля 2011

Этот вопрос получил меня в интервью. Если B является подклассом A. При конструировании B существует ли время, когда конструктор A не вызывается?

РЕДАКТИРОВАТЬ: Я сказал интервьюеру, что я не могу думать о таком случае, потому что я думал, что было бы разумно только правильно построить суперкласс до создания подкласса.

Ответы [ 5 ]

6 голосов
/ 28 апреля 2011

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

A и B оба имеют неявно объявленные конструкторы, которые не будут использоваться в этой инициализации.

Аналогичным образом, если A не имеет объявленного пользователем конструктора, но появляется в списке инициализаторов членов конструктора B, но с пустым инициализатором, тогда A будет инициализироваться значением , когда используется конструктор B. Опять же, поскольку A не имеет объявленных пользователем конструкторов, значение-инициализация не использует конструктор.

5 голосов
/ 28 апреля 2011

Полагаю, вы могли бы сделать что-то, что вызовет исключение при создании параметров для конструктора не по умолчанию для A в списке инициализации B?

Ниже вы можете видеть, что конструктор для A никогда не вызывается, потому чтоисключение происходит при генерации параметров для него

#include <iostream>

using namespace std;

int f()
{
    throw "something"; // Never throw a string, just an example
}


class A
{
public:
    A(int x) { cout << "Constructor for A called\n"; }
};


class B : public A
{
public:
    B() : A(f()) {}
};


int main()
{
    try 
    {
        B b;
    }
    catch (const char* ex) 
    {
        cout << "Exception: " << ex << endl;
    }
}
2 голосов
/ 28 апреля 2011

Виртуальное наследование .

struct B {...};
struct D1 : virtual B {...};
struct D2 : virtual B {...};
struct Child : D1, D2 {...};

Обычно конструктор B() должен вызываться дважды, но вызываться только один раз.

0 голосов
/ 28 апреля 2011

Если у B есть второй суперкласс, который создается до A, будет период, когда конструктор A еще не был вызван, хотя и будет.

0 голосов
/ 28 апреля 2011

Построение B невозможно даже до тех пор, пока A не будет полностью построено, поэтому ответ будет no .

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