C++ 虚拟函数和运行时多态性
在基类的声明中使用了关键字virtual并在派生类中被重新定义(Overridden)的成员函数被称为虚拟函数。晚期绑定指令指示编译器在运行时通过匹配对象和适当的调用函数来执行调用函数。运行时多态性指的是这种方法。
- 无论用哪种引用(或指针)来调用一个函数,虚拟函数都能确保为一个对象调用正确的函数。
- 它们的主要目的是实现运行时多态性。
- 在基类中,函数是用虚拟关键字声明的。
- 函数调用的运行时解析被进行了。
多态性是一个术语,用来描述承担几种形态的能力。如果有一个通过继承而相互连接的类的层次结构,就会发生这种情况。多态性被定义为 “在不同的环境中表现出不同的特征”,它可以被概括为 “在各种情况下表现出不同的特征 “和 “多态性”。
虚函数的用途是什么
为了实现运行时多态性,主要使用虚函数。只有基类类型指针(或引用)才能实现运行时多态性。一个基类指针也可以同时指向基类的对象和派生类的对象。
另外,在不知道派生类对象的类型的情况下,我们可以使用虚拟函数来编译基类指针的列表,并调用派生类的任何方法。
例子
#include
using namespace std;
class B {
public:
virtual void s() {
cout<<" In Base \n";
}
};
class D: public B {
public:
void s() {
cout<<"In Derived \n";
}
};
int main(void) {
D d; // An object of class D
B *b= &d // A pointer of type B* pointing to d
b->s(); // prints "D::s() called"
return 0;
}
输出 。
虚拟函数的规则是什么
- 虚拟函数不允许是静态的,也不允许对其他类友好。
- 访问虚拟函数需要基类类型的指针或引用。
- 基类和任何派生类都应该使用相同的函数原型。
- 一个类中不能有一个虚拟构造函数。然而,它可能有一个虚拟的销毁器。
- 基类总是定义它们,而派生类则重新定义它们。
什么是运行时多态性
运行时多态性是指在运行时将一个对象与一种能力结合起来的过程。重载方法是实现运行时多态性的一种方式。在运行时,而不是在编译时,Java虚拟机决定调用哪个方法。此外,还被称为动态绑定或晚期绑定。根据这个概念,父类的方法在子类中被重写。术语 “方法覆盖 “指的是子类专门实现由其父类之一提供的方法的情况。你可以在下面的例子中看到运行时多态性。
例子
class Test {
public void method()
{
System.out.println("Method 1");
}
}
public class DEMO extends Test {
public void method()
{
System.out.println("Method 2");
}
public static void main(String args[])
{
Test test = new DEMO();
test.method();
}
}
输出 。
虚拟函数是如何工作的
如下所述,如果一个类有一个虚拟函数,编译器会执行两个任务。
- 一个虚拟指针(VPTR),它指向类的VTABLE,如果该类的一个对象被创建,它将被添加为该类的一个数据成员。每创建一个新的对象,就会有一个新的虚拟指针作为数据成员添加到该类中。
- VTABLE,一个函数指针的静态数组,无论是否生成一个对象,都是该类的成员。该类中的每个虚拟函数都包含在这个表的单元格中的类地址。
虚函数的限制是什么
- 较慢:虚拟机制导致函数调用的时间稍长,使编译器更难优化,因为它不确定在编译时将调用哪个函数。
- 虚函数会使在复杂的系统中确定一个函数从哪里被调用变得稍有挑战性,这使其在调试时更具挑战性。