我在 C++ 中遇到一个问题,即在具有指向基类的指针时调用派生类的函数。
编辑: 一些答案让我引用了 CRTP
但我的观点是我需要一个指向“Base*”类而不是“Base*”的指针,因为我不知道当前正在处理的类型(当前实例是从某种工厂创建的) .
类:
class Base
{
..
template<typename T>
func (T arg) { ... };
};
class Derived1 : public Base
{
...
template<typename T>
func (T arg) { ... };
};
class Derived1 : public Base
{
...
template<typename T>
func (T arg) { ... };
};
用法:
int main()
{
Base* BasePtr = new Derived1();
// The expected function to be called is Derived1::func<int>()
BasePtr->func<int>();
return 0; // :)
}
我无法将 func 设为虚拟,因为该语言不支持虚拟模板函数。
仅当类具有模板参数时才允许,但如果其中的函数具有模板参数则不允许。
我在 Boost.Serialization 中看到了类似的问题,但无法理解该解决方案。
谢谢,
科比梅尔
最佳答案
实现Curiously recurring template pattern(CTRP) .
插图:
template<typename D>
class Base
{
public:
template<typename T>
void func (T arg)
{
static_cast<D*>(this)->func(arg);
}
};
class Derived1 : public Base<Derived1>
{
public:
template<typename T>
void func (T arg) { /*...*/ }
};
Base<Derived1> *basePtr = new Base<Derived1>();
basePtr->func(100);
关于c++ - 调用派生类的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6026707/