本文概述
- 后期绑定或动态链接
- C ++虚函数示例
- 纯虚函数
- C ++虚函数是你在派生类中重新定义的基类中的成员函数。使用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;
}
【C++虚函数解析】输出:
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.
在上面的示例中, 基类包含纯虚函数。因此, 基类是抽象基类。我们无法创建基类的对象。
推荐阅读
- C++中的数据抽象
- C++ this指针
- C++结构体用法
- C++静态static解释
- C++多态解析
- C++重载(函数和运算符)
- C++ OOP面向对象编程的概念
- C++对象和类解析
- C++命名空间用法