博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
More Effective C++ (虚拟构造函数)
阅读量:5155 次
发布时间:2019-06-13

本文共 1885 字,大约阅读时间需要 6 分钟。

在了解代码之前,请先仔细阅读这些概念:

<1>虚构造函数:

一种允许你做一些 C++不直接支持的事情的用法。

你可能通过虚函数 virtual clone()(对于默认拷贝构造函数)或虚函数 virtual create()(对于默认构造函数),得到虚构造函数产生的效果。

<2>虚拟拷贝构造函数:

一种特殊的虚拟构造函数――虚拟拷贝构造函数――也有着广泛的用途。

虚拟拷贝构造函数能返回一个指针,指向调用该函数的对象的新拷贝。

因为这种行为特性,虚拟拷贝构造函数的名字一般都是copySelf,cloneSelf或者是像下面这样就叫做clone。

<3>协变返回类型:

注意:下述代码的实现利用了被采纳的较宽松的虚拟函数返回值类型规则。

被派生类重定义的虚拟函数不用必须与基类的虚拟函数具有一样的返回类型。

如果函数的返回类型是一个指向基类的指针(或一个引用),那么派生类的函数可以返回一个派生类的指针(或引用)。

这不是C++的类型检查上的漏洞,它使得有可能声明像虚拟构造函数这样的函数。

这就是为什么Circle 的clone函数能够返回Circle * 和 Square 的clone也能够返回Square *的原因,即使Shape 的clone返回值类型却为Shape *。

备注:根据坊间记录,以前的编译器是不支持这个东东的。

<4>虚拟构造函数

因为它能建立新对象,它的行为与构造函数相似,而且因为它能建立不同类型的对象,我们称它为虚拟构造函数。

虚拟构造函数是指能够根据输入给它的数据的不同而建立不同类型的对象。

虚拟构造函数在很多场合下都有用处,从磁盘(或者通过网络连接,或者从磁带机上)读取对象信息只是其中的一个应用。

示例代码1如下:

1 #include
2 using namespace std; 3 class Shape 4 { 5 public: 6 virtual ~Shape() { } // 虚析构函数 7 8 // 使用默认拷贝构造函数 ,more effective c++中成为虚拟拷贝构造函数 。涉及"协变返回类型" 9 virtual Shape* clone() const = 0; 10 // 使用默认构造函数11 virtual Shape* create() const = 0; 12 };13 14 class Circle : public Shape 15 { 16 public:17 Circle()18 {19 cout<<"Construction Circle "<
<

 示例代码2如下:

1 #include
2 using namespace std; 3 4 class Object 5 { 6 public: 7 Object() 8 {} 9 virtual ~Object() 10 {} 11 virtual void print() const = 0; 12 public: 13 virtual Object* CloneSelf() const = 0; 14 virtual Object* CopySelf() const = 0; 15 }; 16 17 class Int:public Object 18 { 19 private: 20 int value; 21 public: 22 Int(int x = 0):value(x) 23 {} 24 ~Int() 25 {} 26 void print() const 27 { 28 cout<
<
print();129 }130 cout<

Good Good Study, Day Day Up.

顺序  选择  循环  坚持

转载于:https://www.cnblogs.com/Braveliu/archive/2013/01/06/2847363.html

你可能感兴趣的文章
ZH奶酪:自然语言处理工具LTP语言云调用方法
查看>>
.NET中将图片文件流转成Base64字符串的实现
查看>>
js如何操作或是更改sass里的变量
查看>>
BZOJ1419: Red is good
查看>>
腾讯云-搭建 JAVA 开发环境
查看>>
POJ 3308 Paratroopers (对数转换+最小点权覆盖)
查看>>
rendering omni shadow in one pass.
查看>>
No repository found containing,eclipse 自动更新erro 解决
查看>>
iOS设计模式之单例模式
查看>>
MySQL面试题中:主从同步的原理
查看>>
HTTP和WebSocket协议(二)
查看>>
项目练习(二)—微博数据结构化
查看>>
Jquery插件的编写和使用
查看>>
跨域请求
查看>>
灌水导论——灌水法初步
查看>>
Vim 使用教程(搬运)
查看>>
常问面试题
查看>>
《构建之法》课程总结及建议
查看>>
echarts使用
查看>>
SQL2005触发器和存储过程
查看>>