C++的虚函数

虚在哪里

虚函数成就了多态,意思就是指向基类的指针在操作它的多态类对象时,会根据不同的类实例,调用其相应的函数。关键词——继承/指针/实例

 

怎么实现的呢?

编译器针对虚函数采用“VTABLE”机制。编译器发现一个类中有被声明为virtual的函数,就会为其搞一个虚函数表,也就是VTABLE。VTABLE实际上是一个函数指针的数组,每个虚函数占用这个数组的一个slot。一个类只有一个VTABLE,不管它有多少个实例。ONE CLASS,ONE VTABLE . 派生类有自己的VTABLE,但是派生类的VTABLE与基类的VTABLE有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置上。在创建类实例的时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的VTABLE。通过这些手段,编译器在看到一个基类的虚函数调用的时候,就会将这个调用指向对应实例所属的那个类的虚函数。

 

示例说明?

//基类,virtual关键字处理

class A{

  virtual void foo(){

    print("from A\n");

  }

}

//子类,方法名前virtual可加可不加,根据是否要继承B实现B方法的多态需求而定

class B:class A{

  void foo(){

    print("from B\n")

  }

}

//实例化并调用

void call(){

  A *a1 = new A();

  A *a2 = new B();

  a1->foo();

  a2->foo();

}

输出结果是——

from a

from b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值