Как я могу переопределить чисто виртуальный метод, используя приватно унаследованный метод?

У меня есть следующее:

class Abstract
{
virtual void AbstractMethod() = 0;
};

class Implementer
{
void AbstractMethod() {};
};

class Concrete : public Abstract, private Implementer
{};

Я не могу создать экземпляр Concrete потому что чисто виртуальный метод AbstractMethod не отменяется Что я делаю неправильно?

2

Решение

Вы используете множественное наследование здесь.

Бетон имеет две иерархии, которые рассматриваются отдельно:

Аннотация и Исполнитель. Поскольку Аннотация не имеет никакого отношения к Реализатору, использование вами виртуального в этом случае (для наследования одного и того же брака) не удастся.

Вам необходимо переопределить виртуальные функции в производных классах. Вы не можете сделать это так, как вы пытаетесь.

В частности, если бы вы переписали его как таковой, он бы работал:

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

6

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


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