C++学习笔记(Thinking in C++)五

1、关于虚函数一些注意点

 class Base{
public:
        virtual void display(){
                cout<<"Base display"<<endl;
        }
};
class CTest: public Base{
public:
        void display(){
                cout<<"CTest display"<<endl;
        }
};
void fun(Base &b){
        b.display();
}
void fun2(Base b){
        b.display();
}
void fun3(Base *b){
        b->display();
}
int main(void){
        CTest ct;
        fun(ct);
        fun2(ct);
        fun3(&ct);
        return 0;
}

重点:要实现虚函数的效果,必须在参数调用的时候实用指针或者引用,如果使用值传递的话,则会调用基类的函数。这是因为每个有许函数的类编译器都会创建一个vtable,并且他们的vptr都在相同的位置。如果使用值传递,则派生类的vtable不会被拷贝到基类对象中。

2、当继承几个抽象基类时,必须实现所有的纯虚函数,否则继承出的类也将是一个抽象类。

     如果类中声明一个纯虚函数,则这个类的VTABLE就是不完全的。

     在基类中,对纯虚函数提供定义是可能的。但是不能定义为inline函数。例如下面这种方式:

class base{

public:

virtual void show()=0 {cout <<"base:"<<endl;}//错误:这种inline方式定义纯虚函数是错误的。

virtual void display() = 0;

};

void base::display(){cout<<"base"<<endl;}//正确的定义。


纯虚函数的原理:

至于纯虚函数的实现
virtual void x() = 0;
这句,等于告诉编译器在VTABLE中为函数保留一个间隔,但在这个特定间隔
中不放地址。只要有一个函数在类中被声明为纯虚函数,则VTABLE就是不完全的

这样当某人试图创建这个类时,编译器会由于不能安全的创建一个纯抽象类的对象
而发出一个出错信息,这样编译器就可以保证抽象类的纯洁性,不会被误用

3、类型转化的问题;

  1 #include <iostream>
  2 using namespace std;
  3
  4 class NVBase{
  5 public:
  6         void display(){}
  7 };
  8 class VBase{
  9 public:
 10         virtual void display(){}
 11 };
 12 class CNVBA: public NVBase{};
 13 class CNVBB: public NVBase{};
 14
 15 class CVBA:public VBase{};
 16 class CVBB:public VBase{};
 17
 18 class COther{};
 19
 20 int main(void){
 21         NVBase* b = new CNVBA;
 22         CNVBA *cta = static_cast<CNVBA *>(b);
 23         CNVBB *ctb = static_cast<CNVBB *>(b);
 24   //COther *cos = static_cast<COther *>(b);//error: invalid static_cast from type ‘NVBase*’ to type ‘COther*’
 25         cout<<"NVBA:"<<(long)cta<<" NVBB:"<<(long)ctb<<" other:"<<(long)cos<<endl;
 26        //输出是:NVBA:143290376 NVBB:143290376 other:


 27         //CNVBA *ctad = dynamic_cast<CNVBA *>(b);//error:(source type is not polymorphic
 28         //CNVBB *ctbd = dynamic_cast<CNVBB *>(b);//error:(source type is not polymorphic
 29         //COther *cod = dynamic_cast<COther *>(b);//error:(source type is not polymorphic
 30
 31         VBase* vb = new CVBA;
 32         CVBA *vba = static_cast<CVBA *>(vb);
 33         CVBB *vbb = static_cast<CVBB *>(vb);
 34  COther *vcos = static_cast<COther *>(vb);//error: invalid static_cast from type ‘NVBase*’ to type ‘COther*’
 35         cout<<"VBA:"<<(long)vba<<" VBB:"<<(long)vbb<<" other:"<<(long)vcos<<endl;

              //输出是:VBA:143290392 VBB:143290392 other:
 36
 37         CVBA *vbad = dynamic_cast<CVBA *>(vb);
 38         CVBB *vbbd = dynamic_cast<CVBB *>(vb);
 39         COther *vcod = dynamic_cast<COther *>(vb);
 40         cout<<"VBA:"<<(long)vbad<<" VBB:"<<(long)vbbd<<" other:"<<(long)vcod<<endl;

              //输出是:VBA:143290392 VBB:0 other:0 

 41         return 0;
 42 }
综上所述,static_cast<>可以实现非虚和虚函数的转化,但是不支持非派生类的向下转化;dynamic_cast<>只能实现有虚函数的向下转化;强制转化COther *o=(COther*) vb;或者b都可以实现强制转化。

 

 

1.WINDOWS 2000或以上, LINUX, FREEBSD等操作系统   2.APACHE, IIS等标准网络环境   3.PHP 4.3.x 环境(www.php.net)   4.ZEND 编码支持(www.zend.com)   ###### 3.01插件列表 ######   1.QQ模块   2.联盟论坛系统   3.首页公告模块   4.银行系统   5.买卖限制系统   6.在线媒体播放支持   7.性别插件   8.预览主题自由选择回帖方式或主题方式   9.更全面的中文支持   10.在线列表的排列方式调整   11.自由选择回帖后返回的方式。   .....     ############################   ###### 安装方法(请务必仔细查看) ######   ############################   1.首先请确定服务器已安装了zend模块支持,否则将无法正常安装程序,   请自行通过phpinfo信息查看服务器运行环境,如未安装,请登录   http://www.zend.com/store/free_download.php?pid=13   下载最新版的zend optimizer来进行服务器配置。   2.安装前请打开includes文件夹内的config.php.new文件进行基础配置,   配置完毕后重新命名为config.php,并上传到相同的目录内。   3.请登?a\u00a0href='\u7cf7ttp://www.cnvbb.com/bbs/vipreg.php\u9875\u9762\u7533\u8bf7\u7f51\u7ad9\u4e13\u7528\u6fc0\u6d3bKEY\uff0c'    \u00a0target='_blank'>糷ttp://www.cnvbb.com/bbs/vipreg.php页面申请网站专用激活KEY,   请务必仔细填写详细资料,此份资料一次申请后将无法更改,为确保能正   常安装,请不要在此页面进行测试。   4.将下载下的key.dat文件上传到网站根目录内,此KEY为验证信息,在安   装前请妥善保留好这个文件。   5.执行install目录内的install.php文件,根据需要进行全新安装或升级,   并按照操作提示执行。   6.在最后一步,将进行服务器信息验证,为确保正确运行,请务必确保所   安装的网址与申请网址相同,并仔细看清楚这个提示页面的文字信息,一   次安装后,这个KEY将无法再次进行新安装,如需要,请通过备份文件或在   网站上重新下载。   7.安装完毕后,为了确保安全,请务必删除install目录。   8.登录./admincp目录进行后台管理配置。       此版本将是作为 CNVBB 的最后一版 vBulletin 插件版程序提供下载,自此后   CNVBB将不再进行任何有关 vBulletin 的开发,也将在稍后的日子里关闭 vbb   交流区。   中国的网络就是如此,用这别人辛苦做的程序,嘴里却又说这不好,说那烂,   我从事IT行业也已经将近5年的时光,经历过网络的发展,但现在已完全失去了   当年交流讨论的氛围,可以看到,在3年前存在的技术交流网站,在现在几乎已   全部不付存在,这就是当今网络的现实。希望那些成天背后说人家不好的朋友,   请先自醒,也许因为你的一句话,中国就从此少了一位辛勤开发的程序员。也许   你的一句鼓励,中国会多更多为大家服务的朋友。   也许有人说我唯利是图,为了小小的100块 VIP 费用,精力却不原意花在月薪5、6K   的工作上,既然已经是最后的一个vbb程序了,不想再多解释,一切已经过去,   也不会再有第二次。   认真做好自己,认真做人。   新论坛马上就将启动,最后的一版vbb,最后的告别。   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值