More Effective C++ 条款25 将constructor和non-member function虚化
2015-09-26 22:04
393 查看
1. Virtual constructor
原则上构造函数不能为虚:虚函数用于实现"因类型而异的行为",也就是根据指针或引用所绑定对象的动态类型而调用不同实体,但构造函数用于构造对象,在对象构造之前自然没有动态类型的概念,虚与非虚也就无从谈起.所谓的的virtual-constructor实际上是"仿virtual-constructor",它本质上不是constructor,但能够产生不同类型的对象,从而实现"virtual-constructor"的功能,考虑以下继承层次用于管理新闻报道:
View Code
non-member的虚化和virtual copy constructor的实现类似:写一个虚函数做实际工作,再一个非虚函数调用该虚函数.此外,为了避免函数调用的额外成本(毕竟operator<<只有一句,不值得将压弹栈的成本),可以将非虚函数inlin化.
到此为止,可以做到让non-member copy constructor视其某个自变量而虚化,要实现根据一个以上自变量的虚化,见条款31.
原则上构造函数不能为虚:虚函数用于实现"因类型而异的行为",也就是根据指针或引用所绑定对象的动态类型而调用不同实体,但构造函数用于构造对象,在对象构造之前自然没有动态类型的概念,虚与非虚也就无从谈起.所谓的的virtual-constructor实际上是"仿virtual-constructor",它本质上不是constructor,但能够产生不同类型的对象,从而实现"virtual-constructor"的功能,考虑以下继承层次用于管理新闻报道:
class NLComponent { public: virtual ostream& print(ostream& s) const = 0; ... }; class TextBlock: public NLComponent { bbs.theithome.com public: virtual ostream& print(ostream& s) const; ... }; class Graphic: public NLComponent { public: virtual ostream& print(ostream& s) const; ... }; inline ostream& operator<<(ostream& s, const NLComponent& c){ return c.print(s); }
View Code
non-member的虚化和virtual copy constructor的实现类似:写一个虚函数做实际工作,再一个非虚函数调用该虚函数.此外,为了避免函数调用的额外成本(毕竟operator<<只有一句,不值得将压弹栈的成本),可以将非虚函数inlin化.
到此为止,可以做到让non-member copy constructor视其某个自变量而虚化,要实现根据一个以上自变量的虚化,见条款31.
相关文章推荐
- c++ 日志类 线程安全+缓存
- C语言程序初体验-第十一课-第二题:分离浮点数的整数和小数
- C++中利用libxl操作Excel表格
- Python与C/C++ 代码互调
- [C++]memcpy 小记
- [C++]memcpy 小记
- c++设计模式-----中介者模式Mediator
- 关于素数判定的算法优化
- 《Effective C++》读书笔记(四)
- 浅谈C/C++的浮点数在内存中的存储方式
- C/C++中获取数组的长度
- C语言卷积和C语言互相关:数字信号处理中的卷积和互相关的C语言代码
- 详解C++右值引用
- 浅谈 C++ 中的 new/delete 和 new[]/delete[]
- pat1040有多少个pat。如何解决超时问题
- long类型在C#和C++中的异同
- 【C语言】交换两个数组内容(数组等大)
- C++ STL的常见用法
- 关于C++中定义对象及对象初始化的方法
- 闰年的输出