C++ 虚函数

C++ 虚函数

  • C++虚函数是在基类中重新定义的成员函数,在派生类中使用。它使用virtual关键字声明。
  • 它用于告诉编译器对函数进行动态链接或晚绑定。
  • 需要使用单个指针来引用不同类的所有对象。因此,我们创建指向基类的指针,该指针引用所有派生对象。但是,当基类指针包含派生类对象的地址时,始终执行基类函数。只有使用’virtual’函数才能解决此问题。
  • ‘virtual’是在函数正常声明之前的关键字。
  • 当函数被声明为虚函数时,C++根据基类指针所指对象的类型来确定要在运行时调用的函数。

晚绑定或动态链接

在晚绑定中,函数调用在运行时解析。因此,编译器在运行时确定对象的类型,然后绑定函数调用。

虚函数的规则

  • 虚函数必须是某个类的成员。
  • 虚函数不能是静态成员。
  • 通过对象指针访问它们。
  • 它们可以是另一个类的友元。
  • 虚函数必须在基类中定义,即使不使用。
  • 基类和所有派生类的虚函数的原型必须相同。如果两个函数具有相同的名称但不同的原型,C++将将它们视为重载函数。
  • 我们不能有虚构造函数,但我们可以有虚析构函数。
  • 考虑不使用virtual关键字时出现的情况。
#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  

纯虚函数

  • 虚函数不用于执行任何任务,它只是作为一个占位符。
  • 当函数没有定义时,该函数被称为“ do-nothing ”函数。
  • do-nothing ”函数被称为 纯虚函数 ,它是在基类中声明但相对于基类没有定义的函数。
  • 包含纯虚函数的类不能用于声明其自身的对象,这样的类被称为抽象基类。
  • 基类的主要目的是为派生类提供特征,并创建用于实现运行时多态的基指针。

纯虚函数可定义为:

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.

在上面的例子中,基类包含纯虚函数。因此,基类是一个抽象基类。我们不能创建基类的对象。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程