Смотрите следующий код:Почему абстрактные производные классы должны инициализировать виртуальный базовый класс?
struct Object;
struct Component
{
Component(Object* obj) { }
};
struct Renderable : public virtual Component
{
virtual void Render() = 0;
};
struct AnimationRenderer : public Renderable
{
AnimationRenderer(Object* obj) : Component(obj) { }
virtual void Render() { }
};
Это не может скомпилировать, потому что нет соответствующего вызова Component::Component()
из Renderable::Renderable()
.
я могу сделать эту работу образца, давая Renderable
конструктор, такие как Renderable() : Component(NULL) { }
, даже если визуализируемый никогда не смогут инициализировать компонент.
Потому что Renderable
- абстрактный класс, он никогда не может быть создан непосредственно. Поскольку он фактически наследуется от Component
, он никогда не сможет вызвать инициализацию Component
.
В чем причина языка, требующего кода, который никогда/никогда не будет вызван?
Я также открыт для предложений по лучшему названию. –
Я думаю, что это то, что «абстрактное» означает - то, о чем мы можем думать, но не как конкретный объект. – Dinesh
абстрактный класс может быть создан, компилятором. – yngccc