原创 高质量C++/C编程指南 -- 第8章 C++函数的高级特性-2

2008-10-28 09:51 2212 3 3 分类: 软件与OS

8.1.3 当心隐式类型转换导致重载函数产生二义性


示例8-1-3中,第一个output函数的参数是int类型,第二个output函数的参数是float类型。由于数字本身没有类型,将数字当作参数时将自动进行类型转换(称为隐式类型转换)。语句output(0.5)将产生编译错误,因为编译器不知道该将0.5转换成int还是float类型的参数。隐式类型转换在很多地方可以简化程序的书写,但是也可能留下隐患。



# include <iostream.h>


void output( int x); // 函数声明


void output( float x); // 函数声明



void output( int x)


{


cout << " output int " << x << endl ;


}



void output( float x)


{


cout << " output float " << x << endl ;


}



void main(void)


{


int x = 1;


float y = 1.0;


output(x); // output int 1


output(y); // output float 1


output(1); // output int 1


// output(0.5); // error! ambiguous call, 因为自动类型转换


output(int(0.5)); // output int 0


output(float(0.5)); // output float 0.5


}


示例8-1-3 隐式类型转换导致重载函数产生二义性



8.2 成员函数的重载、覆盖与隐藏
成员函数的重载、覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防。



8.2.1 重载与覆盖


成员函数被重载的特征:


(1)相同的范围(在同一个类中);


(2)函数名字相同;


(3)参数不同;


(4)virtual关键字可有可无。


覆盖是指派生类函数覆盖基类函数,特征是:


(1)不同的范围(分别位于派生类与基类);


(2)函数名字相同;


(3)参数相同;


(4)基类函数必须有virtual关键字。


示例8-2-1中,函数Base::f(int)与Base::f(float)相互重载,而Base::g(void)被Derived::g(void)覆盖。



#include <iostream.h>


class Base


{


public:


void f(int x){ cout << "Base::f(int) " << x << endl; }


void f(float x){ cout << "Base::f(float) " << x << endl; }


virtual void g(void){ cout << "Base::g(void)" << endl;}


};




class Derived : public Base


{


public:


virtual void g(void){ cout << "Derived::g(void)" << endl;}


};




void main(void)


{


Derived d;


Base *pb = &d;


pb->f(42); // Base::f(int) 42


pb->f(3.14f); // Base::f(float) 3.14


pb->g(); // Derived::g(void)


}


示例8-2-1成员函数的重载和覆盖

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /2 下一条