#include <iostream>
using namespace std;
class Parent01 {
public:
Parent01() {
cout << "Parent01" << endl;
}
public:
void aaa() {
cout << "aaa" << endl;
}
void func() {
cout << "Parent01::void func()" << endl;
}
virtual void func(int i) {
cout << "Parent01:: void func(int i)" << endl;
}
virtual void func(int i, int j) {
cout << "Parent01:: void func(int i, int j)" << endl;
}
};
class Child01 : public Parent01 {
public:
// 此处2个参数,和子类func函数是什么关系
void func(int i, int j) {
cout << "Child01:: void func(int i, int j): " << i + j << endl;
}
// 此处23个参数,和子类func函数是什么关系
void func(int i, int j, int k) {
cout << "Child01:: void func(int i, int j, int k): " << i + j + k<< endl;
}
};
void run(Parent01* p) {
p->func(1, 2);
}
/*
* 函数重载:
* 必须在同一个类中进行
* 子类无法重载父类的函数,父类同名函数将被名称覆盖
* 重载是在编译期间根据参数类型和个数决定函数调用
*
* 函数重写:
* 必须发生在父类和子类之间
* 并且父类与子类中的函数必须有完全相同的原型
* 使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)
* 多态是在运行期间根据具体对象的类型决定函数调用
*/
// 在子类中不能重载父类的函数的,编译器就是这么做的。。顺从即可。。
/*
* 重写的两种情况:
* 如果子类函数重写,其父类中增加了virtual关键字,将能产生多态
* 如果子类函数重写,其父类中没有virtual关键字,相当于在子类中重定义,不会产生多态
*/
void main() {
Parent01 p;
p.func();
p.func(1);
p.func(1, 2);
Child01 c;
c.aaa(); // 这个函数从父类继承而来,可以被使用
// 原因:子类和父类有相同名字(变量名字或函数名字)时,子类名字覆盖父类名字,如果想使用父类的资源,需要加::域作用符指定
// C2661 “Child01::func”: 没有重载函数接受 0 个参数
//c.func(); // error 问题1 这个函数从父类继承而来 为什么这个不能被使用? 原因是发生了名称覆盖
c.Parent01::func();
c.func(1, 2);
run(&p);
run(&c);
system("pause");
}
C++ 重载、重写、重定义的区别
最新推荐文章于 2023-08-15 21:14:10 发布