重载重写重定义-易混淆概念-C++编译器处理方式

来源:互联网 发布:政务流程优化再造 编辑:程序博客网 时间:2024/05/16 15:52

1、函数重载

1)必须在同一个类中进行。

2)子类无法重载父类的函数,父类同名函数将被名称覆盖

3)重载是在编译期间根据参数类型和个数决定函数调用

2、函数重写

1)必须发生于父类与子类之间

2)并且父类与子类中的函数必须有完全相同的原型

3)使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)

4)多态是在运行期间根据具体对象的类型决定函数调用

demo

#include <iostream>using namespace std;//重写 重载 重定义//重写发生在2个类之间//重载必须在一个类之间//重写分为2类//1 虚函数重写  将发生多态//2 非虚函数重写 (重定义)class Parent{//这个三个函数func都是重载关系public:virtual void func(){cout << "func() do..." << endl;}virtual void func(int i){cout << "func() do..." << i << endl;}virtual void func(int i, int j){cout << "func() do..." << i << " " << j << endl;}virtual void func(int i, int j, int m, int n){cout << "func() do..." << i << " " << j << endl;}void abc(){printf("abc");}protected:private:};class Child : public Parent{public:virtual void func(int i, int j){cout << "func(int i, int j) do..." << i << " " << j << endl;}virtual void func(int i, int j, int k){cout << "func(int i, int j) do.." << endl;}void abc(){printf("child abc");}/*void abc(int a){printf("child abc");}*/protected:private:};//重载重写和重定义int main(){//: error C2661: “Child::func”: 没有重载函数接受 0 个参数Child c1;//c1.func();//子类无法重载父类的函数,父类同名函数将被名称覆盖c1.Parent::func();//1 C++编译器看到func名字,因子类中func名字已经存在了(名称覆盖).所以c++编译器不会去找父类的4个参数的func函数//2 c++编译器只会在子类中,查找func函数,找到了两个func,一个是2个参数的,一个是3个参数的.//3 C++编译器开始报错.....  error C2661: “Child::func”: 没有重载函数接受 4 个参数//4 若想调用父类的func,只能加上父类的域名..这样去调用..c1.func(1, 3, 4, 5);//c1.func();//func函数的名字,在子类中发生了名称覆盖;子类的函数的名字,占用了父类的函数的名字的位置//因为子类中已经有了func名字的重载形式。//编译器开始在子类中找func函数。。。。但是没有0个参数的func函数 return 0;}



0 0
原创粉丝点击