OverLoad和OverRide分析

来源:互联网 发布:mg动画软件 编辑:程序博客网 时间:2024/04/20 04:15

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

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

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

 

 

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

#pragmaonce

classBase{

public:

          int A(int);

          int A(char*);

          virtual int B(int);

          virtual int B(char*);

          charC(float);

};

classLoadRide:public Base

{

public:

         LoadRide(void);

         ~LoadRide(void);

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

         virtual int B(int);

};

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

#include"LoadRide.h"

#include<stdio.h>

intBase::A(int j){

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

         return j;

}

intBase::A(char*  c){

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

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

         return *c;

}

intBase::B(int j){

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

         return j;

}

intBase::B(char*  c){

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

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

         return *c;

}

LoadRide::LoadRide(void)

{

}

LoadRide::~LoadRide(void)

{

}

charLoadRide::A(float f){

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

         return 'c';

}

charBase::C(float f){

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

         return 'c';

}

intLoadRide::B(int j){

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

         return j;

}

intmain(){

         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

 

 

 

原创粉丝点击