按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
…………………………………………………………Page 121……………………………………………………………
square。display (); // 调用CSquare::display
rect1。setcolor (2); // 于是rect1。m_color = 2
rect1。display (); // 调用CRect::display
rect2。setcolor (3); // 于是rect2。m_color = 3
rect2。display (); // 调用CRect::display
circle。setcolor (4); // 于是circle。m_color = 4
circle。display (); // 调用CCircle::display
注意以下这些事实与问题:
1。 所有类别都由CShape 衍生下来,所以它们都自然而然继承了CShape 的成员,
包括变量和函数。也就是说,所有的形状类别都「暗自」具备了m_color 变量
和setcolor 函数。我所谓暗自(implicit ),意思是无法从各衍生类别的声明中
直接看出来。
2。 两个矩形对象rect1 和rect2 各有自己的m_color,但关于setcolor 函数却是
CRect::setcolor CShape::setcolor
共享相同的 (其实更应该说是 )。我用这张图表
示其间的关系:
这个this 参数是编译器自行为我们加上的,
“ ”
对象rect1 对象rect2 所以我说它是个 隐藏指针 。
CRect::setcolor(int color;
m_color m_color
CRect* this)
{
this…》m_color = color;
}
this 指针 this 指针
rect1。setcolor rect2。setcolor CRect::setcolor
和 调用的都是 ,
后者之所以能分别处理不同对象的成员变量,完全是靠一个隐藏的this 指针。
rect1 setcolor
让我替你问一个问题:同一个函数如何处理不同的资料?为什么 。 和
rect2 setcolor CRect setcolor CShape setcolor
。 明明都是调用 :: (其实也就是 :: ),却能够
rect1 m_color rect2。m_color this
有条不紊地分别处理 。 和 ?答案在于所谓的 指针。下
一节我就会提到它。
59
…………………………………………………………Page 122……………………………………………………………
3。 既然所有类别都有displ ay 动作,把它提升到老祖宗CShape 去,然后再继承
之,好吗?不好,因为displ ay 函数应该因不同的形状而动作不同。
displ ay f or while
4。 如果 不能提升到基础类别去,我们就不能够以一个 循环或
循环干净漂亮地完成下列动作(此种动作模式在对象导向程序方法中重要无
比):
CShape shapes'5';
。。。 // 5 shapes
令 个 各为矩形、四方形、椭圆形、圆形、三角形
for (int i=0; im_color = color; }
};
我们拨开了第一道疑云。
61
…………………………………………………………Page 124……………………………………………………………
虚拟函数与多态(Polymorphism)
我曾经说过,前一个例子没有办法完成这样的动作:
CShape shapes'5';
。。。 // 5 shapes
令 个 各为矩形、四方形、椭圆形、圆形、三角形
for (int i=0; idisplay();
Ellipse Square Triangle Rect Circle Square Circle Circle
为了支持这种能力,C++ 提供了所谓的虚拟函数(virtual function )。
+ ?!
虚拟 函数 听起来很恐怖的样子。如果你了解汽车的离合器踩下去代表汽车空档,
空档表示失去引擎本身的牵制力,你就会了解「高速行驶间煞车绝不能踩离合器」的道
理并矢志遵行。好,如果你真的了解为什么需要虚拟函数以及什么情况下需要它,你就
能够掌握它的灵魂与内涵,真正了解它的设计原理,并且发现认为它非常人性。并且,
真正知道怎么用它。
62
…………………………………………………………Page 125……………………………………………………………
让我用另一个例子来展开我的说明。这个范例灵感得自Visual C++ 手册之一:
Introdoction to C++。假设你的类别种类如下:
CEmployee
CEmployee
CManager CWage
CManager CWage
CSales
CSales
本图以Visual C++ 之「Class Info 窗口」获得
程序代码实作如下:
#0001 #include
#0002
#0003 //……………………………………………………………………………………………………………………………………………………………………
#0004 class CEmployee // 职员
#0005 {
#0006 private:
#0007 char m_