C++ 中的虚函数
本文将介绍 C++ 中的虚函数。 虚函数是特殊的成员函数,它们被声明的派生函数重载或重写,但在基类中定义和声明。
C++ 中的虚函数
关键字 virtual 位于基类中函数声明之前。 这使得编译器进行后期绑定,也称为函数上的动态链接。
运行时编译器的后期绑定或动态链接决定对象类型并绑定函数调用。 简而言之,它是一种在运行时解析函数调用的绑定类型。
使用这些函数可以实现运行时多态性。 因此,每当 C++ 中的函数被设为虚拟时,编译器都会在运行时根据基类指针指向的对象来决定必须调用哪个函数。
示例代码:
#include <bits/stdc++.h>
using namespace std;
class demo {
public:
virtual void fun()
{
cout<<"Inside the base class\n";
}
void check()
{
cout<<"Base class function\n";
}
};
class derived: public demo
{
public:
void fun()
{
cout<<"Inside the derived class\n";
}
void check()
{
cout<<"Derived class fuction\n";
}
};
int main()
{
demo *ptr;
derived d;
ptr = &d;
ptr->fun();
ptr->check();
}
输出:
Inside the derived class
Base class function
在上面的代码中,由于ptr->fun()
是一个虚函数,所以它在运行时绑定,而ptr->check()
是一个非虚函数,所以它在编译时绑定。 这里,运行时多态性是使用基类指针实现的,该指针指向派生类的对象。
C++ 中虚函数的规则
使用虚拟函数时,我们必须牢记以下规则。
-
我们不能有虚拟构造函数,但可以有虚拟析构函数。 使用虚拟析构函数可确保派生类对象以正确的顺序被销毁; 首先,基类对象被销毁,然后派生类对象被销毁。
示例代码:
#include <bits/stdc++.h> using namespace std; class demo { public: demo() { cout<<"Constructing base class\n"; } virtual ~demo() { cout<<"Destroying base class\n"; } }; class derived: public demo { public: derived() { cout<<"Constructing derived class\n"; } virtual ~derived() { cout<<"Destroying the derived class\n"; } }; int main() { demo *ptr; derived *derivedPtr = new derived(); ptr = derivedPtr; delete ptr; }
输出:我们可以观察到遵循了正确的构建和销毁顺序。
Constructing base class Constructing derived class Destroying the derived class Destroying base class
-
当我们想要实现运行时多态性时,只有基类指针或基类引用应该与虚函数一起使用。
-
虚函数永远不可能是静态的。
-
基类和派生类中的虚函数原型应保持相同。
-
虚函数也可以是另一个类的友元函数。
了解 C++ 中的纯虚函数
这些函数是原始虚函数的细微变化。 纯虚函数是不执行任何操作的虚函数。
句法:
virtual void fun() = 0
纯虚函数用于创建抽象类。 这些类的对象无法被创建,从这些类派生的类应该重写纯虚函数; 否则,它们也将被视为抽象类。
示例代码:
#include <bits/stdc++.h>
using namespace std;
class demo {
public:
virtual void fun()=0;
};
class derived: public demo
{
public:
void fun() //overriding the function
{
cout<<"Inside the derived class";
}
};
int main()
{
demo *ptr;
// demo d; This will give compile error as base class demo is abstract class
derived d;
ptr = &d;
ptr->fun();
}
输出:
Inside the derived class
相关文章
Arduino 复位
发布时间:2024/03/13 浏览次数:315 分类:C++
-
可以通过使用复位按钮,Softwarereset 库和 Adafruit SleepyDog 库来复位 Arduino。
Arduino 的字符转换为整型
发布时间:2024/03/13 浏览次数:181 分类:C++
-
可以使用简单的方法 toInt()函数和 Serial.parseInt()函数将 char 转换为 int。
Arduino 串口打印多个变量
发布时间:2024/03/13 浏览次数:381 分类:C++
-
可以使用 Serial.print()和 Serial.println()函数在串口监视器上显示变量值。