c++中基类设置虚函数,和不设置虚函数有区别吗?基类中有个 void fun(){},派生类中也用void fun(){};不就

把基类中得覆盖了吗?这个不是和虚函数有着同样的功能?既然这样,为什么还要设置虚函数?... 把基类中得覆盖了吗?这个不是和虚函数有着同样的功能?既然这样,为什么还要设置虚函数? 展开
 我来答
ecitluo
2011-08-02 · TA获得超过763个赞
知道小有建树答主
回答量:275
采纳率:50%
帮助的人:115万
展开全部
" 基类中有个 void fun(){},派生类中也用void fun(){};"
和 "基类中有个 virtual void fun(){},派生类中用void fun(){};" 它们有差别,这些差别主要体现在多态上。

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

而在基类中加了 virtual 的函数表明该函数是虚函数,它用在多态里面,派生类定义了fun()表示派生类重写了这个函数,它们是有关联的,当通过引用或者指针调用fun()时,将会进行多态解析,根据调用对象来决定调用那一个函数。
在没有用多态的情况下,两者就是一样的,只不过加了 virtual 的函数运行速度可能会慢一些(视编译器优化程度而定)。
Biehege
2011-08-02 · 超过37用户采纳过TA的回答
知道小有建树答主
回答量:70
采纳率:0%
帮助的人:83万
展开全部
虚函数的作用是体现在派生继承方面的。你只需要知道有这样的功能和作用就可以了。在以后,你做软件设计的时候,对于基于对象的设计,就会使模块更清晰。类也有更好的扩展性。

派生类中的函数是虚函数的实例化,它只不过是空函数而已。就像你写文章的时候,要先列出提纲,写着写着的时候,你突然做了些修改,觉得用不着这个函数了,将其置空。但这个在你最初的程序设计中,你可能还没有考虑清楚,所以你刚开始的时候为了更好的扩展性,你将其设置为虚函数。掌握基本功,很重要。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
清影星河6A
2011-08-02 · TA获得超过851个赞
知道小有建树答主
回答量:753
采纳率:0%
帮助的人:899万
展开全部
你可以暂时这么理解,虚函数是专门被指针用的,一定写一个这样的函数试试才能完全明白:
void printData(Base* b)
{
b->func();
}

调用时,这样:
b = new Base;
d = new Drive;
printData(b); // b 为 Base*
printData(d); // d 为 Drive*
看看虚函数与非虚函数,打印有什么不同。
再强调一下,用指针。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友aebc321
2011-08-02 · TA获得超过523个赞
知道小有建树答主
回答量:469
采纳率:95%
帮助的人:185万
展开全部
可以解决二义性问题
追问
什么样的二义性?
追答
二义性是多重继承中常见的问题,虚函数就是为了解决二义性,让子类动态调用从多个父类中继承过来的同名成员函数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式