C++虚拟基础教程文档
收录于 2023-04-20 00:10:05 · بالعربية · English · Español · हिंदीName · 日本語 · Русский язык · 中文繁體
C++虚函数是您在派生类中重新定义的基类中的成员函数。它是使用virtual关键字声明的。 它用于告诉编译器对函数执行动态链接或后期绑定。 有必要使用单个指针来引用不同类的所有对象。因此,我们创建了指向所有派生对象的基类的指针。但是,当基类指针包含派生类对象的地址时,始终执行基类函数。只有使用"虚拟"功能才能解决此问题。 "虚拟"是在函数正常声明之前的关键字。 将函数设为虚拟时,C++根据基类指针所指向的对象的类型来确定在运行时将调用哪个函数。后期绑定或动态链接
后期绑定函数调用在运行时解析。因此,编译器在运行时确定对象的类型,然后绑定函数调用。
虚拟功能规则
虚拟函数必须是某个类的成员。
虚拟函数不能是静态成员。
通过对象指针访问它们。
他们可以成为另一个班级的朋友。
即使未使用虚函数,也必须在基类中对其进行定义。
基类和所有派生类的虚函数的原型必须相同。如果两个函数的名称相同但原型不同,则C++会将它们视为重载函数。
我们不能有一个虚拟的构造函数,但是我们可以有一个虚拟的析构函数
考虑不使用虚拟关键字时的情况。
#include <iostream> using namespace std; class A { int x=5; public: void display() { std::cout << "Value of x is : " << x<<std::endl; } }; class B: public A { int y = 10; public: void display() { std::cout << "Value of y is : " <<y<< std::endl; } }; int main() { A *a; B b; a = &b; a->display(); return 0; }
输出:
Value of x is : 5
在上面的示例中,* a是基类指针。指针只能访问基类成员,而不能访问派生类的成员。尽管C++允许基指针指向从基类派生的任何对象,但是它不能直接访问派生类的成员。因此,需要一种允许基指针访问派生类成员的虚函数。
C++虚拟函数示例
让我们看一下简单用来在程序中调用派生类的C++虚拟函数示例。
#include <iostream> { public: virtual void display() { cout << "Base class is invoked"<<endl; } }; class B:public A { public: void display() { cout << "Derived class is invoked"<<endl; } }; int main() { A* a; //pointer of base class B b; //object of derived class a = &b; a->display(); //Late Binding occurs }
输出:
Derived class is invoked
纯虚函数
虚拟功能不用于执行任何任务。它仅用作占位符。 当函数没有定义时,该函数称为" 不做任何事情"函数。 " 不做任何事情"功能被称为纯虚拟功能。纯虚函数是在基类中声明的函数,相对于基类没有定义。 包含纯虚函数的类不能用于声明其自身的对象,此类被称为抽象基类。 基类的主要目的是为派生类提供特征,并创建用于实现运行时多态性的基指针。
纯虚函数可以定义为:
virtual void display() = 0;
让我们看一个简单的示例:
#include <iostream> using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout << "Derived class is derived from the base class." << std::endl; } }; int main() { Base *bptr; //Base b; Derived d; bptr = &d; bptr->show(); return 0; }
输出:
Derived class is derived from the base class.
在上面的示例中,基类包含纯虚函数。因此,基类是抽象基类。我们无法创建基类的对象。