虚函数与重载函数的区别与联系

 我来答
卓天赐
2009-01-05 · 超过17用户采纳过TA的回答
知道答主
回答量:37
采纳率:0%
帮助的人:0
展开全部
虚函数在基类中声明 用virtual修饰 但是并不实现 ,只是在子类继承基类时才实现

重载函数是基类中已经有某个函数,当子类继承时重新实现(基类已实现)覆盖基类的方法。

这是一楼的两个定义,非常正确,书上是这样定义的

虚函数之所以存在,是因为要实现类对象的多态性,看看下面的一个程序段,你就知道虚函数有什么用了:
class A{
public:
virtual void f(){cout << "A::f" << endl;};
};

class B:public A{
public:
virtual void f(){cout << "B::f" << endl;};
};
class C:public A{
public:
virtual void f(){cout << "C::f" << endl;};
};
void test(A *a){
a->f();
};
int main(int argc, char* argv[])
{
B *b=new B;
C *c=new C;
char choice;
do{
cout<<"type B for class B,C for class C:"<<endl;
cin>>choice;
if(choice==''b'')
test(b);
else if(choice==''c'')
test(c);
}while(1);
cout<<endl<<endl;
return 0;
}

有了虚函数,那么很多种继承类的对象就可以通过一个基类“端口”(这里表现在void test(A *a){a->f();};这个函数的实现),这样才能实现对象里的方法的实现是后面可能选择性的,你可以从反面想象一下,如果没有虚函数的话,这种选择性的对象实现会怎么来编写,当然会使代码变得非常的繁琐。

多态特性的工作依赖虚函数的定义,在需要解决多态问题的重载成员函数前,加上virtual关键字,那么该成员函数就变成了虚函数,从上例代码运行的结果看,系统成功的分辨出了对象的真实类型,成功的调用了各自的重载成员函数。

上面这句话你应该知道两者的关系了啊

多态特性让程序员省去了细节的考虑,提高了开发效率,使代码大大的简化,当然虚函数的定义也是有缺陷的,因为多态特性增加了一些数据存储和执行指令的开销,所以能不用多态最好不用。

参考资料: 经验

rzsonic
2009-01-05 · TA获得超过529个赞
知道小有建树答主
回答量:165
采纳率:0%
帮助的人:200万
展开全部
abstract 抽象方法
virtual 虚方法
重载函数就是override的方法

比如 父类A.m() 子类B.m()
1 abstract的方法,父类可以不实现,让子类去重写(重写=overwrite,不过一般不会提到).父类如果存在abstract方法,那么必然是抽象类,必然不能直接实例化(比如 A a=new A()是不行的),必须由子类去继承并且重写所有抽象方法后再去使用.比如:A a=new B().
2 虚方法,父类写了之后,子类可以去override.继承的时候调用B.m()
class A{
virtual m() {xxxxx}
}

class B:A{
override m()
{base.m();xxxxxxx}
}

3 一般的重载.这个跟继承没有多大关系.普通的类自身不用写什么关键字就能实现.有着同样的名字,但是调用的时候根据参数的不同,编译器选择合适的来使用
class A{
m(){}
m(int ia){}
m(string sa){}
}

4 重载跟抽象还有虚方法可以出现在一个类里面
abstract class A //这个父类声明了一个抽象方法,一个虚方法,自己实现了一个重载
{
abstract void m()
virtual void m(int ia)
void m(string sa)
{
m(Convert.ToInt(sa));
}

class B:A//仅仅是实现了父类没有实现的m()
{
void m(){//xxxxxx}
}
}

class C:A //实现了m()并且重写了被父类定义为虚方法的 m(int ia)
{
void m()//这个必须实现
override void m(int ia){//xxxxx}
}

5 new关键字(不过一般不用去在意)
class D:B //如果是c#其实还有一个new关键字
{
public void new m(string sa){}//这里故意隐藏父类的m(string)方法
}

6 多做做实验练习下,这些东西基本上都是去公司应聘的oo必考题.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sky3gl
推荐于2017-10-01 · 超过25用户采纳过TA的回答
知道答主
回答量:91
采纳率:100%
帮助的人:60.2万
展开全部
虚函数在基类中声明 用virtual修饰 但是并不实现 ,只是在子类继承基类时才实现

重载函数是基类中已经有某个函数,当子类继承时重新实现(基类已实现)覆盖基类的方法。

虚函数和重载在子类和基类中的方法同名,参数类型相同,返回值类型相同。个人感觉 虚函数是一种特殊的重载,即必须被重载的函数(一般函数可以不被重载)
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式