Запечатывание классов в C ++ и виртуальное наследование

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
};

Что здесь происходит? Какую роль здесь играет виртуальное наследование?

3

Решение

Для нормального наследования конструктор производного класса вызывает только конструкторы непосредственный базовые классы. Итак, в первом примере конструктор FailsToDerive вызывает конструктор Sealedкоторый в свою очередь вызывает конструктор ClassSealer, что разрешено делать.

Конструктор фактически унаследованная база, однако, вызывается конструктором самый производный класс. Итак, во втором примере FailsToDeriveконструктор должен уметь вызывать ClassSealerконструктор, что ему запрещено делать, так как он не является другом ClassSealer,

6

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

Других решений пока нет …

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