首页 > 编程知识 正文

c中虚函数的作用(C :虚函数)

时间:2023-05-03 18:38:21 阅读:123943 作者:3766

为了了解虚函数,用virtual关键字描述的函数虚函数是实现运行时多态性的基础c中的虚函数,实现动态绑定的函数虚函数必须是非静态成员函数,虚函数派生后可以实现运行时多态性。 典型的成员函数可以是虚函数构造函数、虚函数析构函数或虚函数的典型虚函数成员的虚函数声明

virtual函数型函数名称(形参数表);

虚函数声明只存在于类定义中的函数原型声明中,在实现成员函数时不存在。

派生类可以复盖基类的成员函数。 虚函数通常不声明为内联函数。 因为调用虚函数需要动态绑定,内联函数的处理是静态的。 virtual关键字派生类不能显式在virtual中声明虚函数。 在这种情况下,派生类中的一个函数成员是否为虚函数取决于派生类中的虚函数是否具有相同的名称、参数的数量以及相应的参数类型。 在从三个方面检查此函数是否具有与基类虚函数相同的返回值,或者是否具有满足类型兼容规则的指针、引用类型返回值、名称、参数和返回值之后,如果派生类中的函数满足上述条件,则将其自动确定为虚函数。 此时,派生类的虚函数复盖基类的虚函数。 派生类中的虚函数隐藏基类中同名函数的所有其他重载格式。 为了提高程序的可读性,派生类中的函数通常也使用virtual关键字。

示例:

# includeiostreamusingnamespacestd; class base1{ public : virtualvoiddisplay () const; //虚函数(; void Base1:display () const ) cout'base1:display ) ) ' endl; } class base 2: public base1{ public : virtualvoiddisplay () const; (; void Base2:display () const ) cout'base2:display ) ) ' endl; } class derived :公共基站2 {公共: virtualvoiddisplay () const; (; void Derived:display () const { cout ' derived 33603360 display ) ) ' endl; }voidfun(base1*ptr ) {ptr-display ); }int main () {Base1 base1; 基本2基本2; 受驱动的; fun (基本1; fun (基本2; 衍生的; 返回0; }为什么虚拟析构函数需要虚拟析构函数? 基类指针中可能会删除派生类对象。如果允许其他用户使用基类指针调用对象的析构函数,则基类的析构函数必须是伪函数。 否则,执行delete的结果不确定。

# includeiostreamusingnamespacestd; class base { public : virtual~base (; (; base :3360~base ((cout ' base destructor ' endl; } class derived :公共基础{公共: derived (; 虚拟~延迟(; 隐私: int * p; (; Derived:~Derived () {cout 'Derived destructor' endl; }虚拟表和动态绑定虚拟表每个多态类在虚拟表虚拟表中有当前类每个虚拟函数的条目地址每个对象都有一个指向当前类虚拟表的指针虚拟指针vptr

造函数中为对象的虚指针赋值通过多态类型的指针或引用调用成员函数时,通过虚指针找到虚表,进而找到所调用的虚函数的入口地址通过该入口地址调用虚函数虚表示意图

抽象类纯虚函数

纯虚函数是一个在基类中声明的虚函数,它在该基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的版本,纯虚函数的声明格式为:

virtual 函数类型 函数名(参数表) = 0;

带有纯虚函数的类称为抽象类

抽象类

带有纯虚函数的类称为抽象类:

class 类名 { virtual 类型 函数名(参数表)=0; //其他成员…… }

抽象类作用抽象类为抽象和设计的目的而声明将有关的数据和行为组织在一个继承层次结构中,保证派生类具有要求的行为。对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现。注意抽象类只能作为基类来使用。不能定义抽象类的对象。

例如:

#include <iostream>using namespace std;class Base1{public:virtual void display() const = 0; //纯虚函数};class Base2 : public Base1{public:virtual void display() const; //覆盖基类的虚函数};void Base2::display() const {cout << "Base2::display()" << endl;}class Derived : public Base2 {public:virtual void display() const; //覆盖基类的虚函数};void Derived::display() const {cout << "Derived::display()" << endl;}void fun(Base1 *ptr){ptr->display();}int main() {Base2 base2;Derived derived;fun(&base2);fun(&derived);return 0;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。