class ClassSealer {
private:
friend class Sealed;
ClassSealer() {}
};
class Sealed : public ClassSealer
{
// ...
};
class FailsToDerive : public Sealed
{
// This class is capable of being instantiated
};
Выше не удается запечатать класс, но следующие работы, почему?
class ClassSealer {
private:
friend class Sealed;
ClassSealer() {}
};
class Sealed : public virtual ClassSealer
{
// ...
};
class FailsToDerive : public Sealed
{
// Cannot be instantiated
};
Что здесь происходит? Какую роль здесь играет виртуальное наследование?
Для нормального наследования конструктор производного класса вызывает только конструкторы непосредственный базовые классы. Итак, в первом примере конструктор FailsToDerive
вызывает конструктор Sealed
который в свою очередь вызывает конструктор ClassSealer
, что разрешено делать.
Конструктор фактически унаследованная база, однако, вызывается конструктором самый производный класс. Итак, во втором примере FailsToDerive
конструктор должен уметь вызывать ClassSealer
конструктор, что ему запрещено делать, так как он не является другом ClassSealer
,
Других решений пока нет …