C++虚函数简单记录

目录

动态绑定和静态绑定

1.对象的静态类型:对象在声明时采用的类型。是在编译期确定的。

2.对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改。

3.静态绑定:绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期

4.动态绑定:绑定的是对象的动态类型,某特性(比如函数)依赖于对象的动态类型,发生在运行期

这里是引用
class A
{
}
class B : public A
{
}
class C: public A
{
}
C* c = new C(); //c的静态类型是它声明的类型C*,动态类型也是C*
A* a = c; //a的静态类型是它声明的类型A*,动态类型是a所指向的对象c的类型C*
B b = new B();
a = b; //a的动态类型是可以更改的,现在它的动态类型是B*

总结:普通成员函数看静态类型,虚函数看动态类型(但是缺省参数是静态绑定的)。

函数执行动态绑定的三个条件:
1.通过指针来调用函数。

2.指针upcast向上转型(继承类向基类的转换称为upcast)。

3.调用的是虚函数。

虚函数表和虚函数指针

虚函数表

1.每个包含虚函数的类都包含了一个虚函数表。子类继承了包含虚函数的基类,那么这个子类也拥有自己的虚表。

2.虚表是一个指针数组其元素是虚函数的指针,每个元素对应一个虚函数的函数指针。虚函数指针的赋值发生在编译器的编译阶段

3.虚表是属于类的,而不是属于某个具体的对象,一个类只需要一个虚表即可。同一个类的所有对象都使用同一个虚表

虚函数指针

1.编译器在类中添加了一个指针,__vptr*,用来指向虚表。这样,当类的对象在创建(运行期,动态绑定)时便拥有了这个指针,且这个指针的值会自动被设置为指向类的虚表。

2.对象的虚表指针用来指向自己所属类的虚表,虚表中的指针会指向其继承的最近的一个类的虚函数(非重写的虚函数)。

int main()
{
B bObject;
A *p = & bObject;
p->vfunc1();
//A中有虚函数vfunc1(),B继承A并重写了vfunc1()。
}
p的静态类型是A,动态类型是B, 因为虚函数指针是动态运行时候指定的,所以 p->vfunc1()为B::vfunc1()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值