c++虚函数之我见

通过将基类中的成员函数声明为虚函数,那么子类中的同原型函数构成成为基类中的虚函数的覆盖版本,此时,通过指向子类的对象的基类指针(或者引用)调用该虚函数,实际被调用函数版本的由指针(或者引用)所指向的对象决定,而于指针(引用)本身的类型无关,此语法现象叫做多态

 

动态类型绑定和虚函数表
A * pa=new B
当编译器看到如下的函数调用时,
pa->bar()
它不知道pa所指向的对象的确切类型,编译器就会生成一段代码替代以上的函数调用  该代码执行如下的操作
1:确定pa所指向的对象的实际类型
2: 然后通过这个对象的虚函数表  指针,vftb1访问其虚函数表
找到与foo函数相对应的虚函数入口地址
3: 根据入口地址调用该函数

 

 

class parent{
	public:
		parent(){
			cout<<"parent contrount"<<endl;
		}
		virtual void hello(){}
		void parent_hello_1(){
			cout<<"hello parent hello_1"<<endl;
		}
};
class child :public parent
{
	public :
		child(){
			cout<<"child contrount"<<endl;
		}
		void hello(){
			cout<<"child  child hello ....."<<endl;
		}
		void child_hello_1(){
			cout<<"child hello _1"<<endl;
		}
};
int main(int argc, const char *argv[])
{
	parent * p=new child;
	p->hello();
	return 0;
}

 

 

 

 

 

运行结果:

parent contrount
child contrount
child  child hello

 

虚析构函数

1:通过将基类的析构函数定义为虚函数 当delete一个指向子类的基类的指针时,实际上被调用的是子类的析构函数,而子类的析构函数 将会自动调用基类的 析构函数 ,进而保证类对象及其基类的对象都能够得到释放
2:即使析构函数  什么也不作,仅仅为了实现提供一个虚析构函数也需要基类定义该析构函数,因为缺省析构函数不是虚函数
3:如果一个类中包含有虚函数,那么总将其定义一个虚析构函数总没有坏处 


纯虚函数,抽象类,纯抽象类 的定义和区分
1:纯虚函数   :virtual 返回类型  成员函数名  (形参表)=0;
2:包含纯虚函数 的类叫做抽象类   抽象类不能实例化对象
3:完全由纯虚函数组成的抽象类,叫做纯抽象类



不可以是虚函数的:  构造函数    静态成员函数   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值