在了解代码之前,请先仔细阅读这些概念:
<1>虚构造函数:一种允许你做一些 C++不直接支持的事情的用法。
你可能通过虚函数 virtual clone()(对于默认拷贝构造函数)或虚函数 virtual create()(对于默认构造函数),得到虚构造函数产生的效果。
<2>虚拟拷贝构造函数:一种特殊的虚拟构造函数――虚拟拷贝构造函数――也有着广泛的用途。
虚拟拷贝构造函数能返回一个指针,指向调用该函数的对象的新拷贝。
因为这种行为特性,虚拟拷贝构造函数的名字一般都是copySelf,cloneSelf或者是像下面这样就叫做clone。
<3>协变返回类型:注意:下述代码的实现利用了被采纳的较宽松的虚拟函数返回值类型规则。
被派生类重定义的虚拟函数不用必须与基类的虚拟函数具有一样的返回类型。
如果函数的返回类型是一个指向基类的指针(或一个引用),那么派生类的函数可以返回一个派生类的指针(或引用)。
这不是C++的类型检查上的漏洞,它使得有可能声明像虚拟构造函数这样的函数。
这就是为什么Circle 的clone函数能够返回Circle * 和 Square 的clone也能够返回Square *的原因,即使Shape 的clone返回值类型却为Shape *。
备注:根据坊间记录,以前的编译器是不支持这个东东的。
<4>虚拟构造函数因为它能建立新对象,它的行为与构造函数相似,而且因为它能建立不同类型的对象,我们称它为虚拟构造函数。
虚拟构造函数是指能够根据输入给它的数据的不同而建立不同类型的对象。
虚拟构造函数在很多场合下都有用处,从磁盘(或者通过网络连接,或者从磁带机上)读取对象信息只是其中的一个应用。
示例代码1如下:
1 #include2 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 #include2 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.
顺序 选择 循环 坚持