OverLoad和OverRide分析

本文通过一个C++程序示例分析了OverLoad和OverRide的区别,指出C++的OverLoad仅限于类内部,而Java则不同。OverLoad横向扩展函数名用途,OverRide纵向扩展函数签名用途。示例中展示了如何使用基类和派生类指针调用不同版本的方法,并强调了类型转换在调用覆盖成员时的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++的方法Overload机制只能在一个类内部扩展方法名的用途,这一点与Java不同,需要注意,下面自己写了一个小程序以展示,其中顺便也提到了OverRide。

为什么提到OverRide呢,其实我觉得这两者都是用Open-Close原理在语言设计上的具体应用,一个在横向上扩展某个函数名的用途,一个在纵向上扩展某个函数签名的用途。

代码如下,VC++2005验证过:

 

 

类型声明代码LoadRide.h如下:

#pragma once

class Base{

public:

          int A(int);

          int A(char*);

          virtual int B(int);

          virtual int B(char*);

          char C(float);

};

class LoadRide:public Base

{

public:

         LoadRide(void);

         ~LoadRide(void);

         char A(float); //这里打开,Base的两个A方法就被遮盖了

         virtual int B(int);

};

实体定义代码LoadRide.cpp如下:

#include "LoadRide.h"

#include <stdio.h>

int Base::A(int j){

         printf("您对Base::int@A@int输入了int值:%i /n",j);

         return j;

}

int Base::A(char*  c){

         printf("您对Base::int@A@char*输入了指针,它指向地址:%p /n",c);

         //c++; //危险,这个函数的使用者很可能输入一个引用进来

         return *c;

}

int Base::B(int j){

         printf("您对Base::int@B@int输入了int值:%i /n",j);

         return j;

}

int Base::B(char*  c){

         printf("您对Base::int@B@char*输入了指针,指向地址:%p /n",c);

         //c++; //危险,这个函数的使用者很可能输入一个引用进来

         return *c;

}

LoadRide::LoadRide(void)

{

}

LoadRide::~LoadRide(void)

{

}

char LoadRide::A(float f){

         printf("您对LoadRide::int@C@char*输入了浮点数:%f /n",f);

         return 'c';

}

char Base::C(float f){

         printf("您对Base::int@C@char*输入了浮点数:%f /n",f);

         return 'c';

}

int LoadRide::B(int j){

         printf("您对LoadRide::int@B@int输入了int值:%i /n",j);

         return j;

}

int main(){

         LoadRide o;

         Base* pb = &o ;

         LoadRide* pl = &o;

         char c = 'c';

         //子类一旦用了函数名A,不论什么参数返回值,父类的A们就不能再直接调用了

         //printf("%i /n", o.A(&c));

         //printf("%i /n", o.A('c'));

         printf("%i /n", pb->A(&c)); //但是被遮住的A却可以用父类类型的指针调用;

         //printf("%i /n", pl->A(&c)); //被遮住的A们不能用子类类型的指针调用;

         printf("%i /n", o.C(1.0));

         printf("%i /n", pb->B(&c));

         printf("%i /n", pb->B('c')); //并不是指针类型而是所指向实际对象类型来判断具体成员

         pb = &(static_cast<Base>(o)); //要调用其它父类或子类override成员,要转换对象类型

         printf("%i /n",  pb->B('c'));

         getchar();

         //static_cast可以往父类cast,如果调用了子类成员,编译器会报错

         //dynamic_cast只能往成员更多的子类去cast,因为运行期间必须保证对象访问的成员都存在

}

运行结果如下:

 

您对Base::int@A@char*输入了指针,它指向地址:0013FF33

99

您对Base::int@C@char*输入了浮点数:1.000000

99

您对Base::int@B@char*输入了指针,指向地址:0013FF33

99

您对LoadRide::int@B@int输入了int值:99

99

您对Base::int@B@int输入了int值:99

99

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值