设为首页 加入收藏

TOP

<六>关于虚函数和动态绑定
2023-07-23 13:34:44 】 浏览:28
Tags:< > 关于虚

问题:是不是虚函数的调用就一定是动态绑定?不是的
1:在类的构造函数当中,调用虚函数,也是静态绑定(构造函数中对虚函数的调用不发生动态绑定)
2:如果不是通过指针或者引用变量来调用虚函数,那就是静态绑定

代码1

class Base
{
public:
	Base(int data=10):ma(data){
	   cout<<"Base()"<<endl;
        }
	//虚函数
	virtual void show(){cout<<"Base Show()"<<endl;}
	//虚函数
	virtual void show(int){cout<<"Base Show(int)"<<endl;}
	~Base(){cout<<"~Base()"<<endl;}
protected:
	int ma;
};

class Derive : public Base
{
	public:
	 Derive(int data=20):Base(data),mb(data){
	      cout<<"Derive()"<<endl;
	 }
	void show(){cout<<"Derive Show()"<<endl;}
        ~Derive(){cout<<"~Derive()"<<endl;}
	private:
        int mb;
};

int main(){
	 
	 Base b(10);
	 Derive d(20);
         b.show();//通过对象调用,静态绑定,不发生多态
	 d.show();//通过对象调用,静态绑定,不发生多态
	 //想一想为什么? b.show()如果发生动态绑定,b访问自己的虚函数表,自己虚函数表的show方法是自己Base的void show()方法的方法地址
         //d.show() 如果发生动态绑定,d访问自己的虚函数表,自己虚函数表的show方法是自己Derive的void show()的方法地址
         //访问的都是属于自己的函数地址,没有必要去走动态绑定机制
	

         //动态绑定,必须通过指针调用虚函数,因为指针本身自己不知道自己指向了什么,所以要调什么方法就必须通过动态绑定来定位最终调用什么方法,这才有意义
         Base *pb=&b;
	 Base *pb=&d;
         pb->show();//发生动态绑定
         pb->show();//发生动态绑定

        //动态绑定,必须通过引用调用虚函数
         Base &rb1=b;
         rb1.show();//发生动态绑定
        
         Base &rd1=d;
         rd1.show();//发生动态绑定

         return 0; 
        
}
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇<八>理解抽象类 下一篇为什么标准库的模板变量都是inlin..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目