C++继承:模板与指针
C++ inheritance: Templates Vs Pointers
我试图了解继承方案中指针和模板之间的最佳解决方案是什么。
请考虑以下类。
class Event
{
};
class Filter
{
public:
virtual void process(Event *event) = 0;
};
class Pipeline
{
private:
std::vector<Filter*> _filters
};
每个用户都可以展开 Event 类和 Filter 类来保存实际数据和实际筛选函数。管道类仅将筛选器与队列连接在一起,并执行方法进程。
到目前为止,我总是使用指针来处理继承,例如过滤器指针的 std::vector 和接收 Event 指针的进程函数。可以使用模板代替指针吗?
例如
class Event
{
};
template<class Event> class Filter
{
public:
virtual void process(Event *event) = 0;
};
template<class Filer> class Pipeline
{
private:
std::vector<Filter> _filters
};
这是否有效,甚至可能,主要含义是什么?
我还有另一个例子要讨论。请考虑以下代码:
template<class Element, class Cluster>
Cluster* closestCluster(Element *e, std::vector<Cluster*> &clusters)
{
double minDist = clusters[0]->distance(e);
Cluster *c = clusters[0];
for(std::size_t i = 1 ; i < clusters.size(); ++i)
{
double tmp = clusters[i]->distance(e);
if(tmp < minDist)
{
minDist = tmp;
c=clusters[i];
}
}
return c;
}
Cluster* closestCluster(Element *e, std::vector<Cluster*> & clusters)
{
double minDist = clusters[0]->distance(e);
Cluster *c = clusters[0];
for(std::size_t i = 1 ; i < clusters.size(); ++i)
{
double tmp = clusters[i]->distance(e);
if(tmp < minDist)
{
minDist = tmp;
c=clusters[i];
}
}
return c;
}
乍一看,我将其视为功能,尽管没有太大区别。但是在我的代码中,只有第一个有效。因为我的集群数组是这种类型的:
std::vector<KMedoidCluster*> &clusters
我认为编译器可以理解KMedoidclsuter是基类Cluster的扩展。但显然它不起作用,所以为了获得一些灵活性,我不得不使用模板。
实质上,您正在将运行时多态性换成编译时多态性。
这意味着,使用第二种方法,管道只能包含一种类型的过滤器,并且该类型必须在编译时已知。第一种方法比这更灵活。
另一方面,第二种方法的内存管理更简单。但是,您可以将智能指针与第一种方法一起使用来简化事情。
此外,第二种方法可能性能更高。这是否相关是一个不同的问题。
简而言之,我会使用第一种方法,但会使用智能指针而不是原始指针。
首先,我认为使用模板可以工作,但您的代码可能会这样写:
class Event
{
};
template<class T1> class Filter
{
public:
virtual void process(T1 *event) = 0;
};
template<class T2> class Pipeline
{
private:
std::vector<T2> _filters
};
使用模板的主要优点是,您不仅可以设置类 T1 事件,还可以设置其他类(如 Event1)。您可以将 T2 设置为过滤器或其他类过滤器 1。
然而,在这种情况下,这成为一个缺点。您无法确保 Filter 类始终可以处理类事件的对象。其他类(如 Event1 的对象)也可以工作。
最后,我建议您在这种情况下使用指针而不是模板。
我希望这对你有帮助。
- 关于C++中具有多重继承"this"指针的说明
- 共享指针继承,而不先显式强制转换
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- 使用智能指针附加的继承对象的深层复制
- 嵌套类、继承和C++中的共享指针
- 删除C++中的继承类指针数组
- 具有虚拟指针和继承的 CPP 类大小
- 钻石继承虚拟成员铸造与指针
- 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- 当依赖关系和依赖关系都是多态时,在哪个继承级别存储依赖关系指针?
- cppyy 继承包含智能指针的类
- 作为模板参数的成员函数指针在继承的成员函数上失败,如何以及为什么?
- 是否可以将成员作为指针继承
- C++14 不能调用从唯一指针继承的类的复制构造函数或运算符 =
- 是无限的Typedef函数指针继承
- 是否可以从 C++11 智能指针继承并覆盖相关运算符?
- 继承:使用从父指针继承的方法
- 使用智能指针继承的皮条
- 是覆盖返回类型所需的指针-继承
- 调用未从BaseClass指针继承的DerivedClass函数