您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记(18)——虚函数与构造函数、析构函数(2)

2008-03-20 00:01 357 查看
本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!


虚函数与构造函数、析构函数(2)

对“C++学习笔记(17)——虚函数与构造函数、析构函数”例子中的CDerive类中的虚函数func()重
新定义,再运行,观察结果。


代码如下:






/**//************************************************************************


* 虚函数与构造函数、析构函数


************************************************************************/


#include <IOSTREAM.H>


class CBase




...{


public:




CBase() ...{cout<<"CBase Constructor! "; }




virtual void func() ...{cout<<"CBase::func() called! "; }


};




class CDerive: public CBase




...{


public:


CDerive()




...{


cout<<"CDerive Constructor! ";


func(); //调用虚函数


}




void func() ...{cout<<"CDerive::func() called! ";}




void func1() ...{func(); //调用虚函数 }


};




class CSubDerive: public CDerive




...{


public:




CSubDerive() ...{cout<<"CSubDerive Constructor! "; }




void func() ...{cout<<"CSubDerive::func() called! ";}


};




void main()




...{


CSubDerive obj; //will produce "CBase::func() called!"


obj.func1(); //will produce "CSubDerive::func() called!"


}


运行结果如下:






在构造函数中加入虚函数

在例7的基础上,在每个类的构造函数中加入对虚函数的调用,并为每个类加上析构函数,且在析构函数中也加入对虚函数的调用,观察在构造函数和析构函数内部有虚函数时的工作情况。


代码如下:



#include <IOSTREAM.H>




//基类


class CBase




...{


public:


CBase()




...{


cout<<"CBase Constructor! ";


func();


}


~CBase()




...{


cout<<"CBase deconstructor! ";


func();


}




virtual void func() ...{cout<<"CBase::func() called! "; }


};




//派生类


class CDerive: public CBase




...{


public:


CDerive()




...{


cout<<"CDerive Constructor! ";


func();


}


~CDerive()




...{


cout<<"CDerive deconstructor! ";


func();


}




void func()...{cout<<"CDerive::func() called! ";}




void func1()...{ func(); //调用虚函数 }


};




//子派生类


class CSubDerive: public CDerive




...{


public:


CSubDerive()




...{


cout<<"CSubDerive Constructor! ";


func();


}


~CSubDerive()




...{


cout<<"CSubDerive deconstructor! ";


func();


}




void func()...{cout<<"CSubDerive::func() called! ";}


};




void main()




...{


CSubDerive obj; //will produce "CBase::func() called!"


obj.func1(); //will produce "CSubDerive::func() called!"


}



运行结果如下:






由上图可知,在构造函数和析构函数内部的虚函数机制是不起作用的,也就是说,调用的是“局部”版本,即该类中的虚函数版本被调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: