虚函数与重载函数的区别与联系
展开全部
虚函数在基类中声明 用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关键字,那么该成员函数就变成了虚函数,从上例代码运行的结果看,系统成功的分辨出了对象的真实类型,成功的调用了各自的重载成员函数。
上面这句话你应该知道两者的关系了啊
多态特性让程序员省去了细节的考虑,提高了开发效率,使代码大大的简化,当然虚函数的定义也是有缺陷的,因为多态特性增加了一些数据存储和执行指令的开销,所以能不用多态最好不用。
重载函数是基类中已经有某个函数,当子类继承时重新实现(基类已实现)覆盖基类的方法。
这是一楼的两个定义,非常正确,书上是这样定义的
虚函数之所以存在,是因为要实现类对象的多态性,看看下面的一个程序段,你就知道虚函数有什么用了:
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关键字,那么该成员函数就变成了虚函数,从上例代码运行的结果看,系统成功的分辨出了对象的真实类型,成功的调用了各自的重载成员函数。
上面这句话你应该知道两者的关系了啊
多态特性让程序员省去了细节的考虑,提高了开发效率,使代码大大的简化,当然虚函数的定义也是有缺陷的,因为多态特性增加了一些数据存储和执行指令的开销,所以能不用多态最好不用。
参考资料: 经验
展开全部
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必考题.
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必考题.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
虚函数在基类中声明 用virtual修饰 但是并不实现 ,只是在子类继承基类时才实现
重载函数是基类中已经有某个函数,当子类继承时重新实现(基类已实现)覆盖基类的方法。
虚函数和重载在子类和基类中的方法同名,参数类型相同,返回值类型相同。个人感觉 虚函数是一种特殊的重载,即必须被重载的函数(一般函数可以不被重载)
重载函数是基类中已经有某个函数,当子类继承时重新实现(基类已实现)覆盖基类的方法。
虚函数和重载在子类和基类中的方法同名,参数类型相同,返回值类型相同。个人感觉 虚函数是一种特殊的重载,即必须被重载的函数(一般函数可以不被重载)
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询