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

Как работает следующий код? Конструктор 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;
}

2

Решение

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

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

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

FinalUser(void) {};

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

FinalUser(): MakeFinal() {}

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

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


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

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

1

Другие решения

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

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

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

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

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

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

1

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

0
По вопросам рекламы [email protected]