为什么要用虚函数,普通函数不行吗

swlilike 2010-12-05 04:45:38
我就是迷惑。。。。

看百度给的解释 不在编译的时候分配地址, 而在调用的时候再分配,

的确, 是在调用的时候建立一个虚函数表,

可是这有什么实质的用处呢?

望给我解答。
...全文
822 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaozhi5855 2010-12-06
  • 打赏
  • 举报
回复
实现了多态
qwer_boo 2010-12-06
  • 打赏
  • 举报
回复

#include <iostream>
#include <stdlib.h>

using namespace std;

class Base1 {
public:
virtual void f() { cout << "Base1::f" << endl; }
void g(){cout<<"Base1::g"<<endl;}
};
class C:public Base1 {
public:
virtual void f() { cout << "C::f" << endl; }
void g(){cout<<"C::g"<<endl;}
void h(){cout<<"C::h"<<endl;}
};
int main()
{
Base1 *b1 = new C();
b1->f();//C::f
b1->g();//Base1::g
//b1->h();//这样调用是错误的,基类中没有h()
C *cc = new C();
cc->f();//C::f
cc->g();//C::g
cc->h();//C::h
system("pause");
return 0;
}
希望对你有用。
东门吹雪 2010-12-06
  • 打赏
  • 举报
回复
C++新手,学习中!
Metrosexual 2010-12-06
  • 打赏
  • 举报
回复
。。。。大家该说的都说了,多态
至善者善之敌 2010-12-06
  • 打赏
  • 举报
回复
虚函数实现运行时候的多态!好处在于它是活动的,不会占用太多的编译时间!

当然也可以用重载实现编译时候的多态!
aihuan959 2010-12-06
  • 打赏
  • 举报
回复
需要多态才用虚函数的吧~
FrankHB1989 2010-12-06
  • 打赏
  • 举报
回复
扯吧。。。
运行时绑定对于实现多态不是必须的。用模板可以实现编译期的静态多态。
虚函数的运行时绑定对实现多态的好处是:不用搞到所有源代码;不用担心目标代码过度膨胀;编译时间也不会长到哪里去。相比静态多态而言效率略低,但一般在可接受范围之内。
不用虚函数的有点不显著,但缺点还是比较容易发现的。从设计角度而言,如果在派生类不小心定义了一个和基类public非虚成员函数同名的成员函数,且没有在派生类使用using声明,那么在派生类作用域会隐藏基类的所有同名函数(注意这里不限参数列表,而虚函数需要),那么使用这个成员时很容易混淆(这里对象类型和作用域规则静态地决定要调用哪个函数,而你无法保证你和所有使用你源代码的其他人——如果有的话——都盯着对象类型不放)。从实现角度而言,就是上面提到的运行时绑定实现多态的问题。
yubaibai1111 2010-12-05
  • 打赏
  • 举报
回复
看看继承、多态相关的部分,你就知道原因了
  • 打赏
  • 举报
回复
虚函数主要是用于实现多态!

那么可能会说怎么才叫一个多态呢? 就是一个父类派生的所有子类都可以通过同一个父类指针进行调用,且能在运行时动态选择调用哪个子类。。。
wkq87 2010-12-05
  • 打赏
  • 举报
回复
多态是C++中很重要的一个概念,虚函数作用主要就是用于多态
wanghaiya 2010-12-05
  • 打赏
  • 举报
回复
虚函数是面向对象里一个概念,而在面向对象里,类是其主要的形式。特别是C++当中;
c++有三个基本特征,分别是:多态,封装,继承;而虚函数是反映多态性的,为了更好的学习c++的多态性,虚函数应该好好学
zengshuangfu 2010-12-05
  • 打赏
  • 举报
回复
新手求指导
dingshaofengbinbin 2010-12-05
  • 打赏
  • 举报
回复
开来楼主是没有一点代码的经验啊!!面向对象都没有搞明白啊!!或者说你不喜欢思考,这是很危险的!!
liutengfeigo 2010-12-05
  • 打赏
  • 举报
回复
别迷惑了,写多了,就自然知道了。
xiaohuh421 2010-12-05
  • 打赏
  • 举报
回复
class A
{
public:
A(){}
~A(){}
virtual void sound(){ OutputDebugString(TEXT("A"));}
};

class B :public A
{
public:
B(){}
~B(){}
virtual void sound(){ OutputDebugString(TEXT("B"));}
};

class C :public A
{
public:
C(){}
~C(){}
virtual void sound(){OutputDebugString(TEXT("C"));}
};
void CTestUserDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
A *arry[2]={0};
B b;
C c;
arry[0]=&b;
arry[1]=&c;
for(int i=0;i<2;i++)
{
arry[i]->sound();//sound是虚函数会输出 B C ; 但是,如是不是虚函数,就只能输出 A A 了.这就是虚函数的用处所在.
}
}
firsthym 2010-12-05
  • 打赏
  • 举报
回复
虚函数是为了实现多态,楼上都已谈到,我就不累赘了。实际用处,我说说,可以补充:
假设你自己实现了一个函数
void Drive(CarType&);
其中CarType是基类,之后你就根本不需要再添加任何接口,只需要派生你的CarType就可以实现各种功能了。
xiaohuh421 2010-12-05
  • 打赏
  • 举报
回复
虚函数主要是方便类的扩展.
比如我们有个动物基类 A 其中有个虚函数 sound()
然后有两个 动物派生类 狗 B 和 鸭 C

并且有一个动物指针数组 A *arry[10];

B b;
C c;
arry[0]=&b;
arry[1]=&c;

这里个我们只要调用arry[i].sound()函数就能得到不同的声音了.

但是,如果你不用虚函数,那么你还得先把arry[i]强制转换成某个类,比如 (B*)arry[0],这样才能得到不同叫声,否则会全部调用A类的声音.

所以虚函数的好处就是会在运行时判断这个指针是指哪个类, 当然是通过查虚函数表得到的.
具体细节还得去看看相关书和自己写点程序试试,用和不用,哪个更方便.
ronghuaqiu 2010-12-05
  • 打赏
  • 举报
回复
虚函数是为了多态函数做嫁衣
hukui161 2010-12-05
  • 打赏
  • 举报
回复
普通函数也可以,麻烦点。
就想叫yoko 2010-12-05
  • 打赏
  • 举报
回复
++[Quote=引用 1 楼 milkylove 的回复:]
虚函数是为了实现多态,多态是一种设计模式,如果用不着多态,就不用虚函数。不过不用多态,面向对象的意义就小了很多。
[/Quote]
加载更多回复(2)

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧