静态多态(模版模拟多态)
2014-09-30 09:37
148 查看
虚函数的使用会带来额外的开销,具有虚函数的class类型都需要一张虚函数表,而每多一个虚函数,对应类型的对象的大小就会增加4bytes(32位机器下),夸张的试想一下如果有10个父类,每个父类都有100个虚函数的情况下,每个对象会增加多少?
4x10x100=4000bytes!
除了空间上的开销,每个虚函数的调用在时间上都会比普通函数多一次整形加法和一次指针间接引用,也就是时间上的开销。
调用方法:、
输出结果:
Derived1 Print
Derived2 Print
这里实现的关键是SelfCast函数,通过static_cast把当前对象强制转换为具体指定的子类对象,这里是Derived1。
4x10x100=4000bytes!
除了空间上的开销,每个虚函数的调用在时间上都会比普通函数多一次整形加法和一次指针间接引用,也就是时间上的开销。
template<typename Derived> class Basic { public: inline void Print() { SelfCast()->Print(); } protected: inline Derived* SelfCast() { return static_cast <Derived*>(this); } }; class Derived1 : public Basic<Derived1> { public: Derived1() {} inline void Print() { std::cout << "Derived1 Print" << std::endl; } }; class Derived2 : public Basic<Derived2> { public : Derived2() {} inline void Print() { std::cout << "Derived2 Print" << std::endl; } static std::string Name() { return "Derived2 Class" ; } };
调用方法:、
Basic<Derived1>* der1 = new Derived1(); der1->Print(); Basic<Derived2>* der2 = new Derived2(); der2->Print();
输出结果:
Derived1 Print
Derived2 Print
这里实现的关键是SelfCast函数,通过static_cast把当前对象强制转换为具体指定的子类对象,这里是Derived1。
相关文章推荐
- 【C++模版之旅】静态多态(模版模拟多态)的讨论
- 静态多态(模版模拟多态)的讨论
- 【C++模版之旅】静态多态(模版模拟多态)的讨论
- 【C++模版之旅】静态多态(模版模拟多态)的讨论
- C++静态多态(模版模拟多态)的讨论
- 【C++模版之旅】静态多态的讨论
- C语言模拟实现C++继承和多态
- C语言模拟多态
- C语言如何模拟C++实现继承和多态
- 类模版静态成员初始化
- 面试一道题--C模拟实现C++的多态
- 多态时的------成员变量----成员函数----静态方法--binbinyang
- 多态的产生、静态,动态联编
- node的serve静态服务器模拟数据跨域问题解决
- static_cast在ATL中很常见.它是实现模版形式多态的关键.
- Java中的重载、重写、多态,静态绑定、动态绑定
- 基于VS2012 Fakes框架的TDD实战——私有成员,静态成员模拟
- java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况
- 黑马程序员 Java基础 面向对象:继承、final关键字、抽象类、模版方法模式、接口、多态、Object类
- java--类与对象、构造方法、this、类变量(静态)、类方法、抽象、封装、继承、多态的回顾