首页 > 代码库 > c++面试题2:虚函数是如何实现的?

c++面试题2:虚函数是如何实现的?


c++面试题2:虚函数是如何实现的?

1、虚函数如何实现的?

  • 虚函数是通过一张虚函数表实现的,有多少个虚函数,就有多少个指针;
  • 在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题;
  • 实际上在编译的时候,编译器会自动加上虚表
  • 虚函数的作用实现动态联编,也就是说在程序运行阶段动态的选择合适的成员函数,在定义了虚函数之后,可以在基类的派生类中对虚函数重新定义。
  • 虚表的使用方法是如果派生类在自己定义中没有修改基类的虚函数,我们就指向基类的虚函数;如果派生类改写了基类的虚函数,这时续表则将原来指向基类的虚函数的地址替换为指向自身虚函数的指针。
  • 必须通过基类类型的引用或指针进行函数调用才会发生多态

举例:

class A
{
public:
   virtual test();
   virtual foo();
};
class B : public A
{
public:
   test();
}
A a;
a.test();   调用的是类A的虚函数test()
B b;
b.test();   调用的是类B的虚函数test()
b.foo();    由于派生类B没有改写基类A的虚函数foo(),所以调用的实际上是基类的函数foo()

c++面试题2:虚函数是如何实现的?