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