More Effective C++之25

原创 2006年06月20日 10:09:00
条款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);

}

相关文章推荐

More Effective C++----技巧 & (25)将构造函数和非成员函数虚拟化

技巧 本书涉及的大多数内容都是编程的指导准则。这些准则虽是重要的,但是程序员不能单靠准则生活。有一个很早以前的卡通片叫做“菲利猫”(Felix the Cat), 菲利猫无论何时遇到困难,它都会拿...

《More Effective C++》条款27:如何让类对象只在栈(堆)上分配空间?

昨天一个同学去网易面试C++研发,问到了这么一个问题:如何限制一个类对象只在栈(堆)上分配空间? 一般情况下,编写一个类,是可以在栈或者堆分配空间。但有些时候,你想编写一个只能在栈或者只能在堆上面分...
  • hxz_qlh
  • hxz_qlh
  • 2013年10月26日 21:27
  • 5930

More Effective C++之Item M21:通过重载避免隐式类型转换

C++规则:每一个重载的operator必须带有一个用户定义类型(user-defined type)的参数; 以下是一段代码,如果没有什么不寻常的原因,实在看不出什么东西: class UP...

指针和引用的区别(More Effective c++ )

指针与引用看上去完全不同(指针用操作符“*”和“->”,引用使用操作符“. ” ),但 是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候 使用指针,在什么时候使用...

More Effective C++之Item M10:在构造函数中防止资源泄漏

如果你正在开发一个具有多媒体功能的通讯录程序。这个通讯录除了能存储通常的文字信息如姓名、地址、电话号码外,还能存储照片和声音(可以给出他们名字的正确发音)。 为了实现这个通信录,你可以这样设计: ...

《More Effective C++》学习心得(四) 关于类中类型转换

#include using namespace std; // example1:单参数构造函数可将内建类型转换为自建的类类型 class A { public: A(doubl...

More Effective C++----异常 & (9)使用析构函数防止资源泄漏

异常 关于C++异常的详细知识,请参考http://blog.csdn.net/qianqin_2014/article/details/51325842> C++新增的异常(exceptio...

More Effective C++ ——08_理解各种不同含义的new和delete

条款八:理解各种不同含义的new和delete1.区别 new操作符(new operator)和operator new    string *ps = new string("Memory Ma...

More Effective C++:Item 27

温习More Effective C++,对于Item 27:要求或禁止在堆中产生对象,整理思路于此文。编译期控制通过禁用编译器产生对象所需的选项即可在编译期阻止对象被定义。产生堆对象所需的选项: ...

More Effective C++议题【一】:指针和引用

> 学习笔记【一】 这个议题作为第一个建议出现在了 More effective ++中, 在一开始,第一件事就是提醒了我们关于指向空值的引用. 即如下代码出现的可能性: char *pc = 0; ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:More Effective C++之25
举报原因:
原因补充:

(最多只允许输入30个字)