imjacob的专栏

首页博文目录订阅
正 文

虚拟构造函数[原创]

(2008/12/14 22:21)

c++本身是没有虚拟构造函数的,但我们可以模拟她。
//模拟虚构造函数。参考more effective c++ item25,
c++ faq item20 http://www.sunistudio.com/cppfaq/virtual-functions.html

/*什么是"虚构造函数(virtual constructor)"?一种允许你做一些 C++ 不直接支持的事情的用法。
你可能通过虚函数 virtual clone()(对于拷贝构造函数)或虚函数 virtual create()(对于默认构造函数),得到虚构造函数产生的效果。
*/


/*
虚拟拷贝构造函数:
还有一种特殊种类的虚拟构造函数――虚拟拷贝构造函数――也有着广泛的
用途。虚拟拷贝构造函数能返回一个指针,指向调用该函数的对象的新拷贝。
因为这种行为特性,虚拟拷贝构造函数的名字一般都是copySelf,cloneSelf或者是象下面这样就叫做clone。
很少会有函数能以这么直接的方式实现它:
*/


/*
协变返回类型:
注意上述代码的实现利用了最近才被采纳的较宽松的虚拟函数返回值类型规则。
被派生类重定义的虚拟函数不用必须与基类的虚拟函数具有一样的返回类型。
如果函数的返回类型是一个指向基类的指针(或一个引用),那么派生类的函数可以返回一个指向基类的派生类的指针(或引用)。
这不是C++的类型检查上的漏洞,它使得有可能声明象虚拟构造函数这样的函数。
这就是为什么Circle 的clone函数能够返回Circle *和Square 的clone能够返回Square *的原因,即使Shape 的clone返回值类型为Shape *。
*/

 class Shape {
 public:
   virtual ~Shape() { }                 // 虚析构函数
  // virtual void draw() = 0;             // 纯虚函数
   //virtual void move() = 0;
   // ...
   virtual Shape* clone()  const = 0;  
// 使用拷贝构造函数 ,more effective c++中成为虚拟拷贝构造函数  。涉及"协变返回类型"
   virtual Shape* create() const = 0;   // 使用默认构造函数
 };
 
 class Circle : public Shape {
 public:
   Circle* clone()  const { return new Circle(*this);}   
//在 clone() 成员函数中,代码 new Circle(*this) 调用 Circle 的拷贝构造函数来复制this的状态到新创建的Circle对象
   Circle* create() const { return new Circle();      }   
//在 create()成员函数中,代码 new Circle() 调用Circle的默认构造函数。
   // ...
 };

 class Square : public Shape {
 public:
   Square* clone()  const { return new Square(*this);}
   Square* create() const { return new Square();      }
   // ...
 };

/*
因为它能建立新对象,它的行为与构造函数相似,而且因为它能建立不同类型的对象,我们称它为虚拟构造函数。
虚拟构造函数是指能够根据输入给它的数据的不同而建立不同类型的对象。
虚拟构造函数在很多场合下都有用处,从磁盘(或者通过网络连接,或者从磁带机上)读取对象信息只是其中的一个应用。
*/

 //userCode模拟虚构造函数
 void userCode(Shape& s)
 {
   Shape* s2 = s.clone();
   Shape* s3 = s.create();
   // ...
   delete s2;    // 在此处,你可能需要虚析构函数
   delete s3;
 }

 int main() {

     Circle c;
     userCode(c);

     Square s;
     userCode(s);
 }

 

评 论
2楼 cyx2009 发表于 2009/3/7 11:22 回复
ding
1楼 nboard 发表于 2008/12/17 01:23 回复
支持,收藏了
博 主
进入imjacob的首页
博客名称:雅克的一府
日志总数:513
评论数量:854
访问次数:1891060
建立时间:2006/11/23 20:52
导 航
公 告
Locations of visitors to this page 本博客主要用于个人学习与资料收藏。当然大家应该读了之后也能学到不少东西。其中大多数资料都是来自网络,我转载时尽可能地表明文章出处与原作者姓名,但由于很多资料经多人转载,已不清楚原作者信息与出处,所以未表明相关…
评 论
链 接

ARM+LINUX 嵌入式博客
http://blog.chinaunix.net/u1/58780/index.html

嵌入式软件
http://blog.csdn.net/embeddedsoft

诚诚恳恳做人踏踏实实编程
http://blog.sina.com.cn/u/1244756857 

和我风格相似的一个blog
http://blogger.org.cn/blog/m…