C++ 虚函数

C++ 虚函数 首页 / C++入门教程 / C++ 虚函数
  • C++虚函数是在派生类中重新定义的基类中的成员函数。它是使用virtual关键字声明的。
  • 它用于告诉编译器对函数执行动态链接或后期绑定。
  • 有必要使用单个指针来引用不同类的所有对象。因此,我们创建了指向所有派生对象的基类的指针。但是,当基类指针包含派生类对象的地址时,始终执行基类函数。只有使用"virtual"虚拟函数才能解决此问题。
  • "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++虚拟函数的简单示例。

#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;    //基类指针
 B b;     //派生类的对象 
 a = &b;  
 a->display();   //后期绑定发生
}  

输出:

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.

在上面的示例中,基类包含纯虚函数。因此,基类是抽象基类。我们无法创建基类的对象。

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

Go语言核心36讲 -〔郝林〕

程序员的数学基础课 -〔黄申〕

OpenResty从入门到实战 -〔温铭〕

MongoDB高手课 -〔唐建法(TJ)〕

后端存储实战课 -〔李玥〕

分布式系统案例课 -〔杨波〕

人人都用得上的写作课 -〔涵柏〕

小马哥讲Spring AOP编程思想 -〔小马哥〕

AI大模型企业应用实战 -〔蔡超〕

好记忆不如烂笔头。留下您的足迹吧 :)