按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
};
void Test(A *a)
{
a…》Func1();
}
class B : public A
{
…
};
class C : public A
{
…
};
// Example
main()
{
A a;
B b;
C c;
Test(&a);
Test(&b);
Test(&c);
};
以上程序看不出“多态”有什么价值,加上虚函数和抽象基类后,“多态”的威力就显示出来了。
C++用关键字virtual来声明一个函数为虚函数,派生类的虚函数将覆盖(override)基类对应的虚函数的功能。示例程序如下:
class A
{
public:
virtual void Func1(void){ coutFunc1();
}
class B : public A
{
public:
virtual void Func1(void){ coutFunc();// p是“野指针”,程序出错
}
6。2。4 使用const
在定义一个常量时,const比 #define更加灵活。用const定义的常量含有数据类型,该常量可以参与逻辑运算。例如:
constint LENGTH = 100;// LENGTH是int类型
constfloatMAX=100;// MAX是float类型
#defineLENGTH 100// LENGTH 无类型
#defineMAX 100// MAX 无类型
除了能定义常量外,const还有两个“保护”功能:
一、强制保护函数的参数值不发生变化
以下程序中,函数f不会改变输入参数name的值,但是函数g和h都有可能改变name的值。
void f(String s);// pass by value
void g(String &s);// pass by referance
void h(String *s);// pass by pointer
main()
{
String name=“Dog”;
f(name);// name的值不会改变
g(name);// name的值可能改变
h(name);// name的值可能改变
}
对于一个函数而言,如果其‘&’或‘*’类型的参数只作输入用,不作输出用,那么应当在该参数前加上const,以确保函数的代码不会改变该参数的值(如果改变了该参数的值,编译器会出现错误警告)。因此上述程序中的函数g和h应该定义成:
void g(const String &s);
void h(const String *s);
二、强制保护类的成员函数不改变任何数据成员的值
以下程序中,类stack的成员函数Count仅用于计数,为了确保Count不改变类中的任何数据成员的值,应将函数Count定义成const类型。
class Stack
{
public:
void push(int elem);
void pop(void);
intCount(void) const;// const类型的函数
private:
intnum;
intdata'100';
};
int Stack::Count(void) const
{
++ num;// 编译错误,num值发生变化
pop();// 编译错误,pop将改变成员变量的值
return num;
}
6。2。5 其它建议
(1)不要编写一条过分复杂的语句,紧凑的C++/C代码并不见到能得到高效率的