c++中基类设置虚函数,和不设置虚函数有区别吗?基类中有个 void fun(){},派生类中也用void fun(){};不就
展开全部
" 基类中有个 void fun(){},派生类中也用void fun(){};"
和 "基类中有个 virtual void fun(){},派生类中用void fun(){};" 它们有差别,这毕散些差别主要体现在多态上。
前者 表明基类中的函数被派生类函数覆盖了,它们几乎没有关联,在C++中就是两个完全不同的函数,只不过恰巧名字一样而已(但有不同的类作用域),就像在不同的作用域定义了两个相同名字的变量。
int a; //类似基类中的fun()
namespace
{
int a; //类似派生类中的fun(),作用域不同
};
而在基类中加了 virtual 的函数表明该函数是虚函数,它用在多态里面,派生类定义了fun()表示派生类重写了这个函数,它们是有关联的,当通过引用或者指针调用fun()时,将会进行多态解析,根据调用对象来决定调用那一个函数。
在没有用多态的情况下,两者就是一样的,只不过加了 virtual 的函数运行速度可能会键晌慢一些(视编译器稿数锋优化程度而定)。
和 "基类中有个 virtual void fun(){},派生类中用void fun(){};" 它们有差别,这毕散些差别主要体现在多态上。
前者 表明基类中的函数被派生类函数覆盖了,它们几乎没有关联,在C++中就是两个完全不同的函数,只不过恰巧名字一样而已(但有不同的类作用域),就像在不同的作用域定义了两个相同名字的变量。
int a; //类似基类中的fun()
namespace
{
int a; //类似派生类中的fun(),作用域不同
};
而在基类中加了 virtual 的函数表明该函数是虚函数,它用在多态里面,派生类定义了fun()表示派生类重写了这个函数,它们是有关联的,当通过引用或者指针调用fun()时,将会进行多态解析,根据调用对象来决定调用那一个函数。
在没有用多态的情况下,两者就是一样的,只不过加了 virtual 的函数运行速度可能会键晌慢一些(视编译器稿数锋优化程度而定)。
展开全部
虚函数的作用是体现在派生继承方面的。你只需要知道有这样的功能和作用就可以了。在以后,你做软件设计的时候,对于基于对象的设计,就会使模块更清晰。类也有更好的扩展性。
派生类中的函数是虚函数的实例化,它只不过是空州则函数而已。就像你写文章的时候,要先列出提纲,写着写散搏着的时候,你突然做了些修改,觉得用不着这个函数了,将其置空。但这个在你最初的程序设计中,你可能还没有考虑清楚,所以你刚开始的时候为了冲迹祥更好的扩展性,你将其设置为虚函数。掌握基本功,很重要。
派生类中的函数是虚函数的实例化,它只不过是空州则函数而已。就像你写文章的时候,要先列出提纲,写着写散搏着的时候,你突然做了些修改,觉得用不着这个函数了,将其置空。但这个在你最初的程序设计中,你可能还没有考虑清楚,所以你刚开始的时候为了冲迹祥更好的扩展性,你将其设置为虚函数。掌握基本功,很重要。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以暂时这么亏尘理解,虚函数是专门被指针用的,一定运陵写一个这样的函数试试才能完旁空戚全明白:
void printData(Base* b)
{
b->func();
}
调用时,这样:
b = new Base;
d = new Drive;
printData(b); // b 为 Base*
printData(d); // d 为 Drive*
看看虚函数与非虚函数,打印有什么不同。
再强调一下,用指针。
void printData(Base* b)
{
b->func();
}
调用时,这样:
b = new Base;
d = new Drive;
printData(b); // b 为 Base*
printData(d); // d 为 Drive*
看看虚函数与非虚函数,打印有什么不同。
再强调一下,用指针。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以解决二义性问题
追问
什么样的二义性?
追答
二义性是多重继承中常见的问题,虚函数就是为了解决二义性,让子类动态调用从多个父类中继承过来的同名成员函数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询