如果不是抽象的话,调用基类方法

时间:2012-01-31 23:46:03

标签: c++ templates abstract

如果它不是抽象的话,如何调用基类方法。

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
}

是否可以在编译时使用模板而不需要太多代码(使用BaseT :: do()调用实例化DerivedClass :: do()方法而不依赖于BaseT类型)? 显然,在WithAbstMethod类中提供实现不是一个选项。上面的代码是伪代码,因此可能包含小错误。

1 个答案:

答案 0 :(得分:3)

实际上,为WithAbstMethod::do()提供实施可能是一种选择。允许抽象函数具有实现。

void WithAbstMethod::do()
{
    // do nothing...
}