
例子:
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 的函数运行速度可能会慢一些(视编译器优化程度而定)。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)