c++重载(overload)和重写(override)的区别和虚函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++重载(overload)和重写(override)的区别和虚函数相关的知识,希望对你有一定的参考价值。

#include<iostream>
using namespace std;

class A
public:
void normal_func(int x)

cout<<"base_class normal func int x"<<endl;

virtual void virtual_func(int x)

cout<<"base_class virtual_func int x"<<endl;

;

class B : public A

public:
void normal_func(int x)

cout<<"derived_class normal func int x"<<endl;

virtual void virtual_func(int x)

cout<<"derived_class virtual_func int x"<<endl;

;
int main(int argc, char *argv[])

A a , *p;
p=&a;
int i=1;
char c='d';
p->normal_func(i);
p->virtual_func(i);

B b;
p=&b;

p->normal_func(c);
p->virtual_func(c);

b.normal_func(c);
b.virtual_func(c);
return 0;

/*
派生类所有参数为int时:
consequence:
base_class normal func int x
base_class virtual_func int x
base_class normal func int x
derived_class virtual_func int x
derived_class normal func int x
derived_class virtual_func int x

派生类所有参数为char时:consequence:
base_class normal func int x
base_class virtual_func int x
base_class normal func int x
base_class virtual_func int x
derived_class normal func char x
derived_class virtual_func char x
*/
我想知道的是为什么这个程序的结果是这些?我有点不太好理解。

overload是同一个函数名,根据参数的不同实现不同的功能。例子:
void add(int a, int b)
return a+b;

void add(float a, float b)
return a+b;

override就是你例子里的重写父类的函数,以实现virtual的功能,基类的指针根据具体带入对象可以调用子类的virtual函数

virtual函数的意义是你用基类的指针去引用子类的对象时,可以调用子类的函数,这点普通函数是不行的。
A* p=new B();
p->normal_func() //将调用基类的定义
p->virtual_func() //将调用子类的定义

至于你的例子里面为什么能带入char类型,我估计是想展示overload的用法,但是代码里面没有写出来
参考技术A B b;
A* p = & b;
p->func();

分两种情况:
1. 如果func被声明为virtual,则p->func()调用的是B类的func()函数
2. 如果func没有声明为virtual,则p->func()调用的是A类的func()函数
如果你能看到“C/C++学习指南 邵发" 的这个书,就不会有此疑问了。

C++重载重写重定义

重载overload:是函数名相同,参数列表不同 重载只是在类的内部存在。但是不能靠返回类型来判断。
重写override:也叫做覆盖。子类重新定义父类中有相同名称和参数的虚函数。函数特征相同。但是具体实现不同,主要是在继承关系中出现的 。
重写需要注意:
1 被重写的函数不能是static的。必须是virtual的
2 重写函数必须有相同的类型,名称和参数列表
3 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public,protected也是可以的
**重定义 (redefining)**也叫做隐藏: 子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) 。
如果一个类,存在和父类相同的函数,那么,这个类将会覆盖其父类的方法,除非你在调用的时候,强制转换为父类类型,否则试图对子类和父类做类似重载的调用是不能成功的。

综上所述,总结如下:
1 成员函数重载特征:
a 相同的范围(在同一个类中)
b 函数名字相同
c 参数不同
d virtual关键字可有可无
2 重写(覆盖)是指派生类函数覆盖基类函数,特征是:
a 不同的范围,分别位于基类和派生类中
b 函数的名字相同
c 参数相同
d 基类函数必须有virtual关键字
3 重定义(隐藏)是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
a 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。
b 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。

以上是关于c++重载(overload)和重写(override)的区别和虚函数的主要内容,如果未能解决你的问题,请参考以下文章

Java中重载(Overload)和重写(Override)的定义

C++重载重写重定义

C++重载重写重定义

Java 重写(Overriding)和重载(Overloading)

重写(覆盖,Override)和重载(Overload)的区别

java语言中,overload(重载)和override(覆盖)有何区别?