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