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
相关文章
C++ 中的余切函数
发布时间:2023/08/23 浏览次数:58 分类:C++
-
本文是关于 C++ 中三角函数的求解。 许多函数在数学库中很容易获得,但有些函数不可用,例如余切函数。对于这样的函数,我们将实现一些高效的用户定义函数。C++ 中的三角函数
C++ 错误 Error: Cannot Call Member Function Without Object
发布时间:2023/08/22 浏览次数:199 分类:C++
-
本文介绍了使用C++进行面向对象编程时,常见的错误“无法调用没有对象的成员函数”。 此外,它还提供了对该错误的潜在修复。修复C++中 Error: Cannot Call Member Function Without Object 错误
C++ std::bad_alloc 异常
发布时间:2023/08/22 浏览次数:119 分类:C++
-
这篇短文讨论了 C++ 中 std::bad_alloc() 异常的主要原因。 它还讨论了使用 C++ 异常处理顺利处理此运行时异常的方法。C++ 中的异常处理
C++ 中的 NULL 未声明错误
发布时间:2023/08/22 浏览次数:157 分类:C++
-
本文将讨论C++中NULL关键字以及未声明NULL的错误。C+ 中的 NULL 关键字 NULL是C++中的常量,用于将指针变量初始化为0。NULL和0可以互换使用。
跳转到 switch 语句中的 Case 标签
发布时间:2023/08/22 浏览次数:103 分类:C++
-
本文将讨论 C++ 中 switch 语句的使用。 此外,还将讨论使用 switch 语句时可能出现的错误,包括跳转到 case 标签错误。C++ 中的 switch 语句
解决C++ 中 - 'Python.h': No such file or directory 错误
发布时间:2023/08/22 浏览次数:118 分类:C++
-
本文将解释如何解决错误“Python.h”:没有这样的文件或目录。 当我们尝试在 C++ 中嵌入 Python 代码,但编译器无法在系统内部找到对 Python 的引用时,通常会发生这种情况。C++ 中 'Python.h': No
C++ 中公共继承、私有继承和受保护继承之间的区别
发布时间:2023/08/22 浏览次数:88 分类:C++
-
在本文中,我们将讨论以下三种类型的继承:Public 继承 Private 继承 Protected 继承 但是,在讨论继承类型之前,我们将讨论 C++ 中基类和派生类的概念。
C++ 调用基类方法
发布时间:2023/08/22 浏览次数:118 分类:C++
-
本文将讨论使用 C++ 从子类调用父类方法。 首先,我们将快速刷新继承。稍后我们将讨论不同场景下调用基类方法以及相关问题。