我有一个关于在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
)。
有人可以告诉我如何实现这个目标吗?
答案 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);
}