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