虚函数的调用

Posted 锅里煮水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚函数的调用相关的知识,希望对你有一定的参考价值。

虚函数的定义:

在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。

考虑下面两个类:
class Base {public: virtual void f();};
class Derived : Base {public: void f();};
在C++中,类的指针或引用有两种类型:静态类型和动态类型。
Base *b; b = new Derived();
对于b,它的静态类型是左边的Base,动态类型是右边的Derived。
如果我这样调用: b->f();那么这就是一个多态调用,因为f()函数是virtual的。虽然我声明的b是Base类型,但实际上,这个f()调用的是Derived类中的f()函数。
可以简单地这样说,在C++中,如果用一个类的指针或者引用调用函数,且这个函数是virtual的,那么这个调用就是多态的,意思就是,它会调用那个指针或者引用的动态类型(也就是实际类型)的相应的函数。
否则的话,这个调用便是非多态的,也就是它只会调用这个对象的静态类型的相应的函数。
注意,也就是说,除了“类对象指针->虚方法”和“类对象引用.虚方法”外,其他的都是非多态调用。
如: Base b;
b.f();
这肯定是调用的基类中的f();如果把上面例子中,virtual去掉,那么:
Base *b = new Derived;
b->f();
也是调用的基类中的f(),而不是它实际类型Derived类中的f()。

 

以上是关于虚函数的调用的主要内容,如果未能解决你的问题,请参考以下文章

关于C++的虚函数在父类的内部调用

通过虚函数表调用虚函数与通过虚函数表(绕过访问权限控制)

c++ 中如何调用基类的虚函数?

如何能避免在调用子类对象的虚函数时调用父类的虚函数呢?

几秒读懂C++虚函数调用的汇编代码实现

使用虚函数表指针来调用虚函数遇到的问题