C++中类中的虚函数

C++中类中的虚函数,第1张

在C++中,如果父类中的函数为虚函数,那么子类里面重载的该函数自动成为虚函数,不管子类中有没有加virtual关键字。所以在子类中,不管pay函数加不加virtual,他都是虚函数,但是为了提高可读性,最好都加上。

原因是:基类通过虚函数可以对多个子类相似的功能实现统一管理。

例子:

A为基类,B、C为A的同级子类。virtual只需在基类中标识一次,子类无需重复标识。

class A

{

virtual void display(){cout<<"是A"<<endl;}

}

class B:public A

{

void display(){cout<<"是B"<<endl;}

}

class C:public A

{

void display(){cout<<"是C"<<endl;}

}

void display(A s)//以A类型作为参数的顶层函数,不同于类中的成员函数

{

s.display()//调用对象s的成员函数

}

int main()

{

A x1

B x2

C x3

display(x1)//显示:是A。

display(x2)//参数x2向上转换为x1类型,显示:是B。

display(x3)//参数x3向上转换为x1类型,显示:是C。

}

通过显示可以注意到以下两点:

1、尽管在顶层函数的定义中是以基类A作为其参数,但却能接受基类A的任一子类作为其参数。事实上,这是基于自动向上类型转换,即子类转换为它的父类型。

2、虽然子类转换成了它的父类型,但却可正确调用属于子类而不属于父类的成员函数。这是虚函数的功劳。

这样,通过设计一个以基类型作为参数的顶层函数,就可实现基类及其所有子类相似功能的统一管理,而不用理会不同对象自身的类型。

" 基类中有个 void fun(){},派生类中也用void fun(){}"

和 "基类中有个 virtual void fun(){},派生类中用void fun(){}" 它们有差别,这些差别主要体现在多态上。

前者 表明基类中的函数被派生类函数覆盖了,它们几乎没有关联,在C++中就是两个完全不同的函数,只不过恰巧名字一样而已(但有不同的类作用域),就像在不同的作用域定义了两个相同名字的变量。

int a //类似基类中的fun()

namespace

{

int a //类似派生类中的fun(),作用域不同

}

而在基类中加了 virtual 的函数表明该函数是虚函数,它用在多态里面,派生类定义了fun()表示派生类重写了这个函数,它们是有关联的,当通过引用或者指针调用fun()时,将会进行多态解析,根据调用对象来决定调用那一个函数。

在没有用多态的情况下,两者就是一样的,只不过加了 virtual 的函数运行速度可能会慢一些(视编译器优化程度而定)。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11784379.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-18
下一篇2023-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存