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
    }
}

仮想テンプレートメソッドについての議論はこれを参照してください

于 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 に答える