高质量C++/C编程指南-第8章-C++函数的高级特性(2)
当前位置:以往代写 > C/C++ 教程 >高质量C++/C编程指南-第8章-C++函数的高级特性(2)
2019-06-13

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

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

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成员函数的重载和包围

    关键字:

在线提交作业