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、将构造函数和非成员函数虚化1、这里所谓的虚拟构造函数,并不是真的指在构造函数前面加上 virtual 修饰符,而是指能够根据传入不同的参数建立不同继承关系类型的对象。class NLCompon...
  • will130
  • will130
  • 2016年05月02日 12:27
  • 2794

《Effective C++》和《More Effective C++》汇总

More Effective C++读书笔记 条款1:指针与引用的区别 二者之间的区别是:在任何情况下都不能用指向空值的引用,而指针则可以;指针可以被重新赋值以指向另一个不同的对象,但...
  • zhu2695
  • zhu2695
  • 2013年06月22日 20:29
  • 2035

Effective C++ 条款25

考虑写出一个不抛出异常的swap函数本节讲解如何自定义一个高效的swap函数对于std名空间中的swap缺省函数如下所示namespace std{ template void swa...
  • u011058765
  • u011058765
  • 2015年06月27日 20:34
  • 607

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

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

More Effective C++学习笔记(4)-效率

主题 概要 C++ More Effective C++ 效率 编辑 时间 新建 20170121 序号 参考资料 1 More ef...
  • shaozhenged
  • shaozhenged
  • 2017年01月21日 20:23
  • 408

more effective c++--引用计数

引用计数是这样一个技巧,它允许多个有相同值的对象共享这个值的实现。这个技巧 有两个常用动机。第一个是简化跟踪堆中的对象的过程。一旦一个对象通过调用 new 被分配 出来,最要紧的就是记录谁拥有这个对象...
  • xdgs_2005
  • xdgs_2005
  • 2015年04月05日 14:22
  • 370

Effective Modern C++ 条款23 理解std::move和std::forward

Effective Modern C++ 条款23
  • big_yellow_duck
  • big_yellow_duck
  • 2016年08月30日 17:11
  • 1246

Effective C++: scott Meyers的几句话

前几天,慕名买了一本关于C++的一本书, 即Scott Mey
  • a130737
  • a130737
  • 2014年07月31日 13:21
  • 517

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

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

Effective Modern C++ 条款26 避免对通用引用进行重载

Effective Modern C++ 条款26
  • big_yellow_duck
  • big_yellow_duck
  • 2016年09月02日 15:52
  • 753
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:More Effective C++之25
举报原因:
原因补充:

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