首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > More Effective C++之25
【标  题】:More Effective C++之25
【关键字】:More,Effective,C++
【来  源】:http://blog.csdn.net/hanyu1980/archive/2006/06/20/815746.aspx

More Effective C++之25

条款25:将constructor和non-member functions虚化
       虚拟构造函数:这个名词有点恐怖,C++的构造函数是不允许虚拟的,那么这个虚拟构造函数又拥有什么样的含义呢?
       考虑如下代码:
class Base //基类
{
};
class DeriveA : public Base
{
};
class DeriveB : public Base
{
};
class ClassSet
{
public:
ClassSet(istream& str)
{
while(str)
    components.push_back(GetObject(str))
}
static Base* GetObject(istream& str);
 
private:

       vector<Base*> components;

};
       所谓虚拟构造函数就是指类ClassSet的构造函数,他能够使components被初始化为各种类型的继承类的集合。这就是所谓虚拟构造函数,我看着和对象工厂非常相似。在以往的程序设计中,这是我们经常使用的手段。
       考虑如下代码:
class Base //基类
{

       virtual Base* clone() const = 0;

};
class DeriveA : public Base
{

virtual DeriveA * clone() const

{return new DeriveA(*this);}

};
class DeriveB : public Base
{

virtual DeriveB * clone() const

{return new DeriveB(*this);}

};
class ClassSet
{
public:
ClassSet(const ClassSet& rhs)
{
//这里有个bug, rhs.components.begin()是非法的

for(vector<Base*>::iterator iter = rhs.components.begin():iter!=rhs.end();iter++)

       components.push_back((*iter)->clone);
}
static Base* GetObject(istream& str);
 
private:

       vector<Base*> components;

};
       这被称作虚拟拷贝构造函数?我现在看这段代码没有问题,需要注意就是需要对STL加深了解。
       非成员函数的虚化非常简单,就是写一个虚函数做实际工作,然后写一个非成员函数啥都不做,只负责调用虚函数,为了减少成本,可以将非成员函数inline。
       考虑如下代码
class Base //基类
{

       virtual ostream* print(ostream& s) const = 0;

};
class DeriveA : public Base
{

virtual ostream* print(ostream& s) const

{return new DeriveA(*this);}

};
class DeriveB : public Base
{

virtual ostream* print(ostream& s) const}

};

inline operator<<(ostream&s ,const Base& c)

{

       return c.print(s);

}
C语言之四书五经[转载]:【上一篇】
一个由于算术移位带来的错误:【下一篇】
【相关文章】
  • Effective STL目录
  • More Effective C++之26
  • C/C++ 语言中结构体的内存分配
  • 打造自己的专业图像工具-Visual C++ 2005图像编程系列【二】
  • 关于ASSERT(断言)使用的规则--摘自《高质量C/C++编程指南》
  • c++常用技巧集
  • 用C实现C++的多态---剖析GTK的"对象" (三)
  • 用C实现C++的多态---剖析GTK的"对象" (四)
  • 一个C++的万年历类
  • c/c++/c#
  • 【随机文章】
  • Google又挖Firefox编程人员 野心昭然若揭
  • 转载“一个中国黑客致中国黑客和红客的公开信”
  • FreeBSD idled 命令介绍
  • unix上防止程序死锁的一些手段
  • 监测站点使用多少session和application的程序
  • 跟我学习安装配置Red Hat9.0
  • 打造安全的Windows 2003系统 下
  • “先知”杨墨(转载)
  • 学习C++模板元编程(7)
  • 取MAC地址
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.