C++ 重载、重写、重定义的区别

#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");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值