Вызов Output
для объектов класса OtherDerived
завершается неудачей не потому, что он виртуальный, а потому, что он объявлен private
в Base
(ну, не явно - но private
является значением по умолчанию в классах, когда ничего другого указано)
Изменить объявление Base
на:
class Base
{
public:
virtual void Output()
{
cout << "OUTPUTTING A BASE OBJECT" << endl;
}
};
И это будет работать. protected
тоже будет работать. Поскольку Output
не является чисто виртуальным , его можно вызывать из подклассов, которые не переопределяют его.