Защищенный конструктор в многоуровневом виртуальном наследовании в C++

Как работает следующий код? Конструктор MakeFinal защищен, поэтому он не должен быть доступен для класса FinalUser. Но я не получил ошибку сборки или выполнения.

class MakeFinal
{
protected:
    MakeFinal(void) {};

public:
    ~MakeFinal(void) {};
};

class Final : virtual public MakeFinal
{
public:
    Final(void) {};
    ~Final(void) {};
};

class FinalUser : public Final
{
public:
    FinalUser(void) {};
    ~FinalUser(void) {};
};

int main()
{
    FinalUser *finalUserHeap_ = new FinalUser();
    return 0;
}

3 ответа

virtual базовый класс инициализируется списком инициализатора члена конструктора одного самого производного класса.

Поскольку virtual base может быть общим объектом базового класса для нескольких производных классов, и инициализации, указанные этими производными классами, могут конфликтовать.

Спецификация инициализации в наиболее производном классе действует концептуально, как если бы наиболее производный класс был получен непосредственно из virtual базовый класс, т.е.

FinalUser(void) {};

… эквивалентно

FinalUser(): MakeFinal() {}

Так как MakeFinal конструктор protected, это доступно для всех производных классов.

Это включает в себя, что это доступно для класса FinalUser,


В других новостях:

Имена в этом коде указывают на то, что речь идет об использовании трюка C++03 для создания класса, который не может (с пользой) быть получен из "конечного" класса. Хитрость заключается в том, чтобы по существу иметь шаблон класса, который может действовать как самый производный класс и который имеет необходимый friend-доступ к другим классам для недоступного конструктора virtual Базовый класс. C++11 ввел ключевое слово final сделать это более легко и без накладных расходов virtual наследование.

Вам нужно знать следующее:

Если наследство publicвсе, что знает о Base и Child, также знает, что Child наследуется от Base.

Если наследство protectedТолько Чайлд и его дети знают, что они наследуют от Базы.

Если наследство privateНикто, кроме Ребенка, не знает о наследстве.

@Anzurio ответ в Разнице между частным, публичным и защищенным наследством

По этому. Вам нужно использовать private если ты этого хочешь FinalUser класс не имеет доступа к MakeFinal,

Производные классы имеют доступ к защищенным членам своих базовых классов. В этом разница между protected а также private,

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