У меня есть следующее:
class Abstract
{
virtual void AbstractMethod() = 0;
};
class Implementer
{
void AbstractMethod() {};
};
class Concrete : public Abstract, private Implementer
{};
Я не могу создать экземпляр Concrete
потому что чисто виртуальный метод AbstractMethod
не отменяется Что я делаю неправильно?
Вы используете множественное наследование здесь.
Бетон имеет две иерархии, которые рассматриваются отдельно:
Аннотация и Исполнитель. Поскольку Аннотация не имеет никакого отношения к Реализатору, использование вами виртуального в этом случае (для наследования одного и того же брака) не удастся.
Вам необходимо переопределить виртуальные функции в производных классах. Вы не можете сделать это так, как вы пытаетесь.
В частности, если бы вы переписали его как таковой, он бы работал:
class Abstract
{
virtual void AbstractMethod() = 0;
};
class Implementer : private Abstract
{
void AbstractMethod() {};
};
class Concrete : public Implementer
{};
Я хотел бы отметить, что использование вами публичного или частного наследования в бетоне не влияет на проблему. Если вы измените Implementer на public в исходном примере, он все равно не будет конкретным классом.
Полезная вспомогательная информация: По возможности избегайте множественного наследования, отдавайте предпочтение композиции, а не мелкому наследованию, а не глубокому. http://en.wikipedia.org/wiki/Composition_over_inheritance
Если вы проходите маршрут множественного наследования, помните о том, что отдельные иерархии наследования по умолчанию используются в C ++, а также о необходимости виртуального наследования для объединения различных путей (для виртуальных методов по-прежнему требуется производный класс, чтобы переопределить их, но не классы одного уровня): http://en.wikipedia.org/wiki/Multiple_inheritance