C++每日一问:什么是虚函数?虚函数的实现原理是什么?

Posted 努力的yhn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++每日一问:什么是虚函数?虚函数的实现原理是什么?相关的知识,希望对你有一定的参考价值。

1 什么是虚函数?
  1. 虚函数是在基类中使用virtual声明的函数。当在编写类函数代码的时候,不确定调用 的基类的类函数代码还是派生类的类函数代码,即需要在运行时刻确定(动态绑定),所以定义为"虚"函数。

    虚函数声明:virtual void foo()

  2. 当在基类中没有具体的实现、但要求每个派生类必须实现此类函数时,需要纯虚函数。其在基类中声明但不实现,且在函数原型后必须加"=0",  如 virtual void function()=0;

  3. 多态就是多种形态、动态绑定。多态和虚函数紧密相连,其意味着:当对象调用类函数时,根据对象类型来执行不同的函数。

更多需要注意的点:       

  1. 在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理, 所以需要纯虚函数以实现多态。含有纯虚函数的类称为抽象类,它不能生成对象;

  2. 友元不是成员函数,只有成员函数才可以是虚拟的,因此友元不能是虚函数;

  3. 析构函数需要定义为虚函数,这样在实现多态时才能调用子类的析构函数;否则只会调用父类的析构函数


2 虚函数的实现原理是什么?
class A {
public:
   virtual void vfunc1();
   virtual void vfunc2();
   void func1();
   void func2();
private:
   int m_data1, m_data2;
};

vptr指针

虚表是属于类的,而不是属于某个具体的对象,一个类只需要一个虚表即可。同一个类的所有对象都使用同一个虚表。为了指定对象的虚表,对象内部包含一个虚表的指针,来指向自己所使用的虚表。为了让每个包含虚表的类的对象都拥有一个虚表指针,编译器在类中添加了一个指针,*__vptr,用来指向虚表。这样,当类的对象在创建时便拥有了这个指针,且这个指针的值会自动被设置为指向类的虚表。

 不带继承的虚函指针

带继承关系的虚指针
类 A 是基类,类 B 继承类 A,类 C 又继承类 B

以上是关于C++每日一问:什么是虚函数?虚函数的实现原理是什么?的主要内容,如果未能解决你的问题,请参考以下文章

转载:什么是虚函数

在C++中,啥是运算符重载?啥是虚函数?

为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数

C++中父类和子类的成员函数同名同参数同返回只是父类里面是虚函数,子类没有虚函数限定 有问题吗

C++基础语法多态

C++基础语法多态