<六>关于虚函数和动态绑定
2023-02-18 16:33:45 时间
问题:是不是虚函数的调用就一定是动态绑定?不是的
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;
}
相关文章
- 【等距螺旋的七个实验】实验五:螺旋公式的一些讨论
- 【等距螺旋的七个实验】实验三:认识风螺旋
- 【等距螺旋的七个实验】实验二
- 【等距螺旋的七个实验】实验一
- 风螺旋与飞行程序设计
- 精密进近当量高的公式推导
- 精密进近中间段保护区模型
- C# DataGrid 用法---极速入门测试
- 阿基米德螺旋公式的再认识
- 史上最详细的等距螺旋公式的推导步骤
- 偏流角(Draft Angle)在等距螺旋中的作用
- 等距螺旋森林的迷路指南
- 论渐开线的“正确”打开方式
- 阿基米德螺旋限制了我们对螺旋的想像
- PBN飞越转弯Flyover衔接DF航段保护区组图
- PBN飞越转弯Flyover衔接TF、CF航段保护区组图
- PBN旁切转弯保护区组图
- 等待模板的算法分析
- JetBrains Rider for mac(跨平台.NET IDE集成开发) v2022.3.1激活版
- 交互周期表:网络中心度(Network Centrality)