3
class ClassSealer { 
private: 
    friend class Sealed; 
    ClassSealer() {} 
}; 
class Sealed : public ClassSealer 
{ 
    // ... 
}; 
class FailsToDerive : public Sealed 
{ 
    // This class is capable of being instantiated 
}; 

Вышеупомянутый не может опечатать класс, но следующие работы, почему?Уплотнение классов в C++ и виртуальном наследовании

class ClassSealer { 
private: 
    friend class Sealed; 
    ClassSealer() {} 
}; 
class Sealed : public virtual ClassSealer 
{ 
    // ... 
}; 
class FailsToDerive : public Sealed 
{ 
    // Cannot be instantiated 
}; 

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

+6

Этот метод устарел. вместо этого используйте новое ключевое слово 'final'. –

+1

@RichardHodges благодарит. Но я хочу знать причину специфического поведения, упомянутого выше. – q126y

ответ

6

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

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

+0

Не могли бы вы рассказать, где читать о вызывающем соглашении конструкторов. Благодаря! – q126y

+1

https://isocpp.org/std/the-standard –

+1

http://en.cppreference.com/w/cpp/language/initializer_list – Brian

 Смежные вопросы

  • Нет связанных вопросов^_^