从基类特定函数调用子类方法

时间:2012-08-07 15:03:38

标签: c++ function virtual

我有一个关于在C ++编程中处理虚函数的问题。我有这样的事情:

template<class T>
class baseClass
{
    virtual void doSomething(T& t) {
        // some baseClass specific code
    }

    void doSomethingElse(T& t) {
        // some baseClass specific code

        this->doSomething(t);
    }
}

template<class T>
class subClass
{
    virtual void doSomething(T&) {
        // some subclass related code
    }
}

现在,如果我构造一个类型为subClass的对象....

int main(int argc, char *argv[])
{
    subClass<anyType> * subClassObject = new subClass<anyType>();
    subClassObject->doSomethingElse(anyTypeObject);
}

....并调用基类的doSomethingElse方法,此方法将调用基类的doSomething方法而不是子类。

我想要的是调用子类的doSomething方法(而不是baseClass)。

有人可以告诉我如何实现这个目标吗?

2 个答案:

答案 0 :(得分:3)

您可以使用CRTP完成此操作:

template<class T, class Derived>
class baseClass
{    
    void doSomethingElse(T& t) {
        // some baseClass specific code
        static_cast<Derived*>(this)->doSomething(t);
    }
}

template<class T>
class subClass : public baseClass<T, subClass>
{
    void doSomething(T&) {
        // some subclass related code
    }
}

有关虚拟模板方法的讨论,请参阅this

答案 1 :(得分:0)

我对你的代码进行了一些更改以使其编译,并且使用g ++ 4.5它表示正在调用子类方法。这是我编译的代码:

#include <iostream>

template<class T>
class baseClass
{
public:
    virtual void doSomething(T& t) {
        std::cout << "Base" << std::endl;
        // some baseClass specific code
    }

    void doSomethingElse(T& t) {
        // some baseClass specific code

        this->doSomething(t);
    }
};

template<class T>
class subClass : public baseClass<T>
{
    virtual void doSomething(T&) {
        std::cout << "Child" << std::endl;
        // some subclass related code
    }
};

int main()
{
    typedef int anyType;

    subClass<anyType> * subClassObject = new subClass<anyType>();
    int foo;
    subClassObject->doSomethingElse(foo);
}