通过基本指针访问派生类中的模板功能
Accessing a templated functions in a derived class via a base pointer
这是我问题的抽象。
我想开发这样的东西。
class Base {
}
template<typename T>
class TypedBase : Base {
f(const T& input);
}
现在,我想通过基本指针访问类typedbase的"家族",并致电f。
类似这样的东西
Base* base_ptr;
if (condition) {
base_ptr = new TypedBase<double>();
} else {
base_ptr = new TypedBase<int>();
}
// Int and double are just examples to get the idea
// Then I Want to call
base_ptr->f(4);
这不会编译。
我尝试在运行时添加一个空的虚拟函数f(),以希望VTable可以照顾正确的F()与F(T&amp; Intup),但再次无法正常工作:
class Base {
virtual f() = 0;
}
那你怎么做?总的来说,我想有一个指向通用键入的指针,该指针使我可以通过通用指针致电F(...)。有任何想法吗?
当然我可以这样做:
class Base {
// Repeat for every typename
virtual f(int& x) = 0;
virtual f(double& x) = 0;
}
,然后每个TypedBase只会实现其中一个,因此我仍然会在运行时获得类型的安全性,而无需在代码中进行动态检查。但是,如果我有n个函数要调用和M类型可以使用,那么我将不得不在基类中添加m*n抽象功能。有更好的解决方案吗?
您必须static_cast
(如果您知道实际类型)或dynamic_cast
(如果您需要检查是否成功)将基本指针指向正确的类。如果您知道要传递给方法的内容,那么将参数的施法施放到键入的情况下应该不是问题。铸件也应使用正确的模板类型来使用模板方法。
以下编译?
template <typename T>
void callF(Base *p, T input) {
TypedBase<T> *tp = dynamic_cast<TypedBase<T>*>(p);
if (tp) tp->f(input);
// else throw exception or call some Base method or return error or...
}
或更少的安全,只需:
static_cast<TypedBase<int>*>(base_ptr)->f(1);
相关文章:
- 将带有派生模板的对象传递给接受具有基本模板的对象的功能
- 为什么从基转换为派生提供此功能?
- 扩展基类并在不更改派生类的情况下使用该功能
- 在销毁派生成员之前,在破坏者中调用共同功能
- 派生类中的成员字段别名(无访问器功能)
- 两个派生类(十六进制 二进制)的虚拟功能
- 如何通过功能指针调用派生方法
- 虚拟功能指针指向派生类中的函数
- 接口会议派生的类功能而无需铸造
- 虚拟功能如何在标题,身体和派生类中起作用
- 如何使程序使用功能过载用于派生的类对象
- 返回返回基本或派生CLSS指针的功能值
- 调用派生功能而不是基本C
- 朋友功能是否继承?为什么基类朋友功能在派生的类对象上工作
- 在基类中公开使用功能,并在派生类中私下使用
- 指向派生类的成员功能,而不是派生的(虚拟)函数
- 继承:从基类调用派生的类功能
- 从派生的指针中调用虚拟功能,而无需支付VTable价格
- C 从基类调用派生类功能
- 派生类命名中的虚拟功能