没有虚拟的多态行为
Polymorphic behaviour without virtual
I这是不使用任何虚拟函数的简单继承的一个很好的实现。
为什么我希望这样:避免在性能关键代码中进行虚拟继承一个boost::变体肯定会在这里有所帮助,但我只想要标准的c++东西:-)
我也参考这个答案链接
#include <iostream>
using namespace std;
struct C;
struct B;
class A{
public:
A(int r): type(r){}
int type;
void deleter();
protected:
~A(){std::cout << "DTOR A" << std::endl;}
};
class B: public A{
public:
B():A(1){};
~B(){std::cout << "DTOR B" << std::endl;}
};
class C: public A{
public:
C():A(2){};
~C(){std::cout << "DTOR B" << std::endl;}
};
void A::deleter(){
if(type==1){
delete static_cast<B* const>(this);
}else if(type==2){
delete static_cast<C* const>(this);
}
}
int main(){
A * a = new B();
a->deleter();
}
我想使用基指针a
。主要的问题是当我们想要delete a
时该怎么办。我只是通过保护A
的DTOR
来禁止这种情况。因此,使用此构造的唯一方法是调用a.deleter()
来安全地删除bas类指针。这是一个安全和良好的实施,还是有更好的方法?
http://ideone.com/pd88xy
您引用了一条准则"避免性能关键代码中的虚拟继承"。这不是一个糟糕的指导方针,但不是最好的措辞。
真正的规则是"避免性能关键代码中的运行时多态性"。运行时多态性会导致性能下降。如果编译器不知道被提前调用的确切函数,那么它就无法跨函数进行优化。(分支预测有帮助,但仍远不如依赖内联的优化)
为了获得高性能和多态性,请将多态性提升到任何循环之外。如果唯一的多态调用是针对大型操作的,那么您不会经常为多态性付出代价。
模板(编译时多态性)可以帮助编写没有代码重复的小操作。然后使用动态调度技术来选择一个高度优化的模板实例。在这一点上,您使用哪种动态调度技术并不重要。虚拟调用,在std::function
中键入擦除,或者您自己的函数指针表。因为与实际工作相比,动态调度操作较小。
相关文章:
- 对于多态类型T,如何在没有类型T实例的情况下获得指向T的虚拟表的指针
- 非虚拟基的多态成员类
- 多态记录器(虚拟模板化函数?
- C 中的多态性和虚拟
- 在多态性中重新定义功能(虚拟),具有不同数量的参数
- 具有虚拟赋值运算符的多态性
- 不是多态类型,或者为什么我们在这里需要虚拟析构函数?
- 减少非虚拟多态类中从基委派到派生委派的样板
- 为什么我需要在子类中重新声明"虚拟"方法?[C++/多态性]
- 如果在编译时间中创建虚拟表,那么为什么我们将其称为运行时间多态性
- 虚拟推导的多态类的大小
- 设计一个没有虚拟析构函数的多态类层次结构
- C++多态性/虚拟函数在此不起作用
- 多态类中的虚拟析构函数
- 方法重写(没有虚拟方法或指针)是否被认为是多态性的一部分
- c++在没有虚拟析构函数的多态性中共享ptr
- 在继承层次结构中将方法定义为虚拟方法一次,以使多态性发挥作用
- c++多态性/纯虚拟函数
- 使用CRTP在静态多态性中模拟纯虚拟函数是可能的
- C++多态性中的访问冲突(虚拟指针函数指向错误的位置?