Вызовите метод базового класса, если не абстрактный - PullRequest
0 голосов
/ 01 февраля 2012

Как вызвать метод базового класса, если он не является абстрактным.

class WithAbstMethod {
public:
    virtual void do() = 0;
}

class WithImplMethod : public WithAbstMethod {
public:
    virtual void do() {
        // do something
    }
}

template<typename BaseT>
class DerivedClass : BaseT {
public:
    virtual void do() {
        BaseT::do(); // here is a question. How to modify code, so that do() is called if it is not abstract?
        // do something
    }
}

void main() {
    DerivedClass<WithAbstMethod> d1;
    d1.do(); // only DerivedClass::do() should be called
    DerivedClass<WithImplMethod> d2;
    d2.do(); // both WithImplMethod::do() and DerivedClass::do() should be called
}

Возможно ли это сделать с помощью шаблонов во время компиляции без большого количества кода (создать экземпляр метода DerivedClass :: do () с BaseT:: do () и без зависимости от типа BaseT?Очевидно, обеспечить реализацию в классе WithAbstMethod не вариант.Код выше является псевдокодом, поэтому может содержать незначительные ошибки.

1 Ответ

3 голосов
/ 01 февраля 2012

На самом деле, предоставление реализации для WithAbstMethod::do() может быть вариантом. Абстрактные функции могут иметь реализацию.

void WithAbstMethod::do()
{
    // do nothing...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...