0

我有一个关于在 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)。

谁能告诉我如何做到这一点?

4

2 回答 2

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

于 2012-08-07T15:24:05.137 回答
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);
}
于 2014-07-31T15:35:59.323 回答