C++的虚函数到底有何实际应用?
最近看到C++的虚函数,总感觉虚函数没有什么必要。比如定义一个Box的类classBox{...public:doublem_lenght,m_height,m_widt...
最近看到C++的虚函数,总感觉虚函数没有什么必要。
比如定义一个Box的类
class Box
{
...
public:
double m_lenght,m_height,m_width;
virtual double Volume() const
{
return m_length*m_height*m_width;
}
}
然后派生出一个名为GlassBox的一个类
class GlassBox: public Box
{
...
public:
virtual double Volume()const
{
return 0.5*m_length*m_height*m_width;
}
}
这里我认为完全可以重新定义一个函数
double GlassVolume()const
{
return 0.5*m_length*m_height*m_width;
}
它依旧可以起到相同的作用,而且也更为明朗。而用虚函数的话,编译器和运行环境还需要为虚函数做多得多的工作,无疑增加了系统的开销。所以说如果虚函数只是起到了少命名一个函数名的话,那我到是认为有些得不偿失了。尽管说工程大的话,应用虚函数可以少命名几个函数,但是如果工程量大的话,多命名几个函数,难道不是可以使函数的意义更为的明朗,而且随着工程量的增加,虚函数所占用的系统资源不是也会相应的增加了很多。
因此在此希望各位大侠能够帮助小弟解答一下C++为何要引用虚函数? 展开
比如定义一个Box的类
class Box
{
...
public:
double m_lenght,m_height,m_width;
virtual double Volume() const
{
return m_length*m_height*m_width;
}
}
然后派生出一个名为GlassBox的一个类
class GlassBox: public Box
{
...
public:
virtual double Volume()const
{
return 0.5*m_length*m_height*m_width;
}
}
这里我认为完全可以重新定义一个函数
double GlassVolume()const
{
return 0.5*m_length*m_height*m_width;
}
它依旧可以起到相同的作用,而且也更为明朗。而用虚函数的话,编译器和运行环境还需要为虚函数做多得多的工作,无疑增加了系统的开销。所以说如果虚函数只是起到了少命名一个函数名的话,那我到是认为有些得不偿失了。尽管说工程大的话,应用虚函数可以少命名几个函数,但是如果工程量大的话,多命名几个函数,难道不是可以使函数的意义更为的明朗,而且随着工程量的增加,虚函数所占用的系统资源不是也会相应的增加了很多。
因此在此希望各位大侠能够帮助小弟解答一下C++为何要引用虚函数? 展开
展开全部
假设盒子还有一个派生类:木条盒子。
那么盒子、玻璃盒子、木条盒子,都可以有一个共同的动作(函数):灌水,但结果不同。
为什么不叫“玻璃灌水、木条灌水”?这就是虚函数的关键点了,
因为在编程的时候,有一个特殊的技巧,虽然我预定了一个盒子,并且商家那边已经根据需求发货了(在另外地方创建了),但使用者还不知道是什么盒子,但都可以通过函数“灌水”来预先安排步骤,盒子到了就知道结果,而不用等到盒子到手,才去决定使用哪个函数(玻璃灌水还是木条灌水山晌)。
道理就是这样,今后接触代码多了,可以加深理解皮唯空,你现在只要知道重载和虚函数的特点,后面应用中燃瞎会进一步加深理解的。
那么盒子、玻璃盒子、木条盒子,都可以有一个共同的动作(函数):灌水,但结果不同。
为什么不叫“玻璃灌水、木条灌水”?这就是虚函数的关键点了,
因为在编程的时候,有一个特殊的技巧,虽然我预定了一个盒子,并且商家那边已经根据需求发货了(在另外地方创建了),但使用者还不知道是什么盒子,但都可以通过函数“灌水”来预先安排步骤,盒子到了就知道结果,而不用等到盒子到手,才去决定使用哪个函数(玻璃灌水还是木条灌水山晌)。
道理就是这样,今后接触代码多了,可以加深理解皮唯空,你现在只要知道重载和虚函数的特点,后面应用中燃瞎会进一步加深理解的。
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
展开全部
多命名几个函数, 一定是可以解决你的问题,裂森备 像你所说的, “可以使函数的意义更为的明朗”,
可这样的做法并不合适C++的继承和派生,
你春饥应该有C的基础,所以看的很直接,不肆毁过对于C++ , 这个是需要换个思维方式。
可这样的做法并不合适C++的继承和派生,
你春饥应该有C的基础,所以看的很直接,不肆毁过对于C++ , 这个是需要换个思维方式。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
虚函数是为了重载,为了可以使用基类的指针引用派生唯中和类对象,这是C++的特性。派生类会继承基类的方法,对于 is-a 关系,指盯派生类和基类会有相同的方法,这时你为什么要用不同的名字?
另外,析构函数不培物虚怎么办?
另外,析构函数不培物虚怎么办?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
虚拟函数是为了对「如果你以一个瞎尘基础类别之银神老指针指向一个衍生类别锋升之对象,那么透
过该指针你就只能够调用基础类别所定义之成员函数」这条规则反其道而行的设计,是了解多态以及动态绑定的关键.
过该指针你就只能够调用基础类别所定义之成员函数」这条规则反其道而行的设计,是了解多态以及动态绑定的关键.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先,我对虚函数了解伍培也不深,但就你这个问题而已,应该可以抛弃虚函数,理旦橘禅解为为什么子类要重写父类的函数,而不是直接新建一个函数。
这应该可以用多态来解释,我们并不关心具体是哪个子类,我们关心的是,我们调用了Volume()函数,至于它返回什么结果,由子类决定。
比如:
Box box = new GlassBox();
box.Volume();
这是多态的一个应用,我们可以直接模尘替换掉GlassBox,比如改为RedBox,而不需要修改box.Volume();这行代码。但运行的结果却能发生改变。
如果每个子类的Volume函数都用不同的名字,那么,我们就不可能编写这样的代码。
而必须改为这样:
GlassBox glassBox = new GlassBox();
glassBox.GlassVolume();
这违背了一个代码设计原则:针对接口编程,而不要针对实现编程。
个人见解,希望帮到你。
这应该可以用多态来解释,我们并不关心具体是哪个子类,我们关心的是,我们调用了Volume()函数,至于它返回什么结果,由子类决定。
比如:
Box box = new GlassBox();
box.Volume();
这是多态的一个应用,我们可以直接模尘替换掉GlassBox,比如改为RedBox,而不需要修改box.Volume();这行代码。但运行的结果却能发生改变。
如果每个子类的Volume函数都用不同的名字,那么,我们就不可能编写这样的代码。
而必须改为这样:
GlassBox glassBox = new GlassBox();
glassBox.GlassVolume();
这违背了一个代码设计原则:针对接口编程,而不要针对实现编程。
个人见解,希望帮到你。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询