#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdlib.h>
using namespace std;
//重写 重载 重定义
//重写发生在2个类之间
//重载必须在一个类之间
/*
1 函数重载概念
函数重载(Function Overload)
用同一个函数名定义不同的函数
当函数名和不同的参数搭配时函数的含义不同
2 函数重载的判断标准
函数重载至少满足下面的一个条件:
参数个数不同
参数类型不同
参数顺序不同
*/
//重写分为2类,必须在有继承的两个类之间发生
//1 虚函数重写 将发生多态
//2 非虚函数重写 (重定义)子类函数
class Parent
{
public:
void abc()
{
cout << "我是父类abcdefg" << endl;
}
virtual void func() //这三个函数是重载,都是属于父类的函数
{
cout << "function() finished" << endl;
}
virtual void func(int i)
{
cout << "function() finished"<<"i="<<i << endl;
}
virtual void func(int i,int j)
{
cout << "function() finished" << "i=" << i <<"j="<<j<< endl;
}
virtual void func(int i,int j,int k,int m)
{
cout << "function() finished" << "i=" << i << "j=" << j<<"k="<<k <<"m="<<m<< endl;
}
};
class Chilid:public Parent
{
public:
void abc()
{
cout << "我是子类的abc函数,我在子类中被重写了" << endl;
}
virtual void func(int i, int j) override//父类有一个两个形式参数的func函数,这是重写
{
cout << "我是子类的重写virtual function() " << "i=" << i << "j=" << j << endl;
}
virtual void func(int i, int j, int k)//与本类的函数构成重载,但是与父类的函数不是重定义--(参数的个数改变了)
{
cout << "子类重写的func函数,有3个参数 "<< "i="<< i << "j=" << j << "k=" << k << endl;
}
};
int main(void)
{
Chilid c1;
//func函数的名字,在子类中发生了名称覆盖;子类的函数的名字,占用了父类的函数的名字的位置
//因为子类中已经有了func名字的重载形式。。。。
//编译器开始在子类中找func函数。。。。但是没有0个参数的func函数
//c1.func();//error C2661: “Chilid::func”: 没有重载函数接受 0 个参数
c1.abc();//调用的子类的abc()函数
Parent p1;//调用父类的abc()函数
p1.abc();
//子类无法重载父类的函数,父类同名函数将被名称覆盖
c1.Parent::abc();//显示调用父类的函数
//1 C++编译器 看到func名字 ,因子类中func名字已经存在了(名称覆盖).所以c++编译器不会去找父类的4个参数的func函数
//2 c++编译器只会在子类中,查找func函数,找到了两个func,一个是2个参数的,一个是3个参数的.
//3 C++编译器开始报错..... error C2661: “Child::func”: 没有重载函数接受 4 个参数
//4 若想调用父类的func,只能加上父类的域名..这样去调用..
c1.Parent::func(1, 2, 3, 4);
system("pause");
return 0;
}
/*
函数重载
必须在同一个类中进行
子类无法重载父类的函数,父类同名函数将被名称覆盖
使用子类对象调用是调用子类的函数,使用父类对象调用是调用父类的函数
重载是在编译期间根据参数类型和个数决定函数调用
函数重写
必须发生于父类与子类之间(必须要有继承)
并且父类与子类中的函数必须有完全相同的原型
使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)
(父类指针指向子类或者父类对象,自动判定调用父类还是子类的成员函数)
多态是在运行期间根据具体对象的类型决定函数调用
我们说函数重写-就是指虚函数重写
==========================================================================
我是子类的abc函数,我在子类中被重写了
我是父类abcdefg
我是父类abcdefg
function() finishedi=1j=2k=3m=4
请按任意键继续. . .
*/
c++继承过程函数重载重写重定义
猜你喜欢
转载自blog.csdn.net/baixiaolong1993/article/details/89205176
今日推荐
周排行