随笔分类 -  C++

摘要:我们知道,一般的,每个类只初始化自己的直接基类。但是在有虚基类存在的时候,这个初始化策略就会失败。因为如果使用这种初始化策略,就会可能多次初始化虚基类,类将沿着包含该虚基类的每个继承路径初始化。所以,为了解决这个重复初始化问题,需要从具有虚基类的类继承的类对初始化进行特殊处理。就是在虚派生中,由最底层派生类的构造函数初始化虚基类。 下面,我们来看一个例子,其继承关系是这样的,有三个基类,分别是人类Human、行为Behavior和非人类行为NonhumanFeature,男人Man和女人Woman公有虚拟继承自Human,人类行为HumanBehavior公有虚拟继承行为Behavior... 阅读全文
posted @ 2012-10-27 15:11 venow 阅读(575) 评论(0) 推荐(0)
摘要:参考<<More Effective C++>>一书中的条款26:"限制某个class所能产生的对象数量",参照"一个用来计算对象个数的基类"中的代码,简单的将里面的代码实现。一个具有对象计数功能的基类,简单来说,就是完成一个base class,作为对象计数之用,并让诸如Printer之类的class继承它。更多内容请参考<<More Effective C++>>一书中的条款26,那里有很详细的描述,这里不再讲解。下面来看看代码是如何实现的。 代码如下:#include "stdafx.h&q 阅读全文
posted @ 2012-10-17 20:15 venow 阅读(552) 评论(0) 推荐(0)
摘要:参考<<More Effective C++>>一书中的条款25:"将constructor和non-member function虚化",简单的将里面的代码实现。 constructor虚化:即virtual constructor,是某种函数,视其获得的输入,可产生不同的类型的对象。它在许多情况下有用,其中之一就是从磁盘(或网络或磁带等)读取对象信息。这里我是直接从文件中根据读取到字符的不同构造不同的对象。 non-member function虚化:即一个虚函数做实际工作,再写一个什么都不做的非虚函数,只负责调用虚函数。这里的虚函数即是prin 阅读全文
posted @ 2012-10-16 20:13 venow 阅读(961) 评论(2) 推荐(1)
摘要:参考<<Effective C++>>一书中的条款10:"如果写了operator new就要同时写operatordelete",写了一个简易的内存池,说白了就是事先分配一块内存空间作为内存池,每次new对象的时候,直接从这里取内存,delete的时候将内存回收到内存池中,代码很简单,废话就不说了,直接看代码。#include "stdafx.h"#include <iostream>using namespace std;//内存池template<typename T> class pool{publ 阅读全文
posted @ 2012-10-08 19:31 venow 阅读(560) 评论(0) 推荐(0)
摘要:一直想写一篇有关C++内存布局的文章,结合编译器VS2010来探讨C++对象模型在内存中的表现形式,主要是自己看《深度探索C++对象模型》太枯燥了,而且这本书也是较早出的,讨论的编译器都差不多过时了,所以才有这个想法,希望看官勿喷。废话少说,let's go...没有虚函数的单继承 下面,我们假设有如下所示的单继承关系: 请注意,在这个继承关系中,父类,子类,都有自己的成员变量。而子类仅仅覆盖了父类的f()函数。 源代码如下:class Base{public: void f(){ cout<<"Base::f()"<<endl; } voi 阅读全文
posted @ 2012-09-11 20:07 venow 阅读(3966) 评论(4) 推荐(1)
摘要:一般我们说虚函数,它的访问级别都是public的,用类对象可以直接调用,这样就可以实现运行时的类型绑定,那如果我们将虚函数私有化会出现什么情况呢?我们先来看一个非虚函数私有化的例子class Base{private: void PrintClassName () { cout<<"Base"<<endl; }public: void print() { PrintClassName(); }};class Derived : public Base{private: void PrintClassName() { ... 阅读全文
posted @ 2012-08-08 21:55 venow 阅读(7596) 评论(3) 推荐(3)
摘要:虚拟继承即派生类继承多次基类,但在派生类中只存在一份基类的拷贝。编译器实现虚拟继承的方式并不相同,下面我结合VS2010来探讨C++虚拟继承。声明一个虚基类CommonBase,两个从虚基类虚拟派生Base1和Base2,然后D,公有多继承自Base1和Base2,具体类定义如下:class CommonBase{public: virtual void commonBaseFunc() = 0;private: int commonBase_data;};class Base1 : public virtual CommonBase{public: virtual void... 阅读全文
posted @ 2012-04-14 11:19 venow 阅读(3224) 评论(7) 推荐(1)