侯俊杰深入浅出MFC》中的一个问题?
书中的一段代码如下:
#include <iostream.h>
class CShape
{
private:
int m_color;
public:
void setcolor(int color)
{
m_color=color;
}
virtual void display()
{
cout<<"CShape\n";
}
};
class CRect : public CShape
{
public:
void display()
{
cout<<"CRect\n";
}
};
class Ctriamgle : public CShape
{
public:
void display()
{
cout<<"Ctriamgle\n";
}
};
class CEllipse : public CShape
{
public:
void display()
{
cout<<"CEllipse\n";
}
};
class CCircle : public CEllipse
{
public:
void display()
{
cout<<"CCircle\n";
}
};
class CSquare : public CRect
{
public:
void display()
{
cout<<"CSquare\n";
}
};
void main()
{
CCircle circle;
CEllipse ellipse;
CRect rect;
CShape shape;
CSquare square;
Ctriamgle triamgle;
CShape *Shape[6]={&circle,&ellipse,&rect,&shape,&square,&triamgle
};
for(int i=0;i<6;i++)
{
Shape[i]->display();
}
}
运行的结果为:
CCircle
CEllipse
CRect
CShape
CSquare
Ctriamgle
Press any key to continue
但是我将main()中的代码变为如下时:
void main()
{
CCircle circle;
CEllipse ellipse;
CRect rect;
CShape shape;
CSquare square;
Ctriamgle triamgle;
CShape Shape[6]={circle,ellipse,rect,shape,square,triamgle
};
for(int i=0;i<6;i++)
{
Shape[i].display();
}
}
运行结果为
CShape
CShape
CShape
CShape
CShape
CShape
Press any key to continue
结果 怎么不一样??
问题点数:20、回复次数:5Top
1 楼triace_zhang(『雪梨码头』)回复于 2006-07-02 09:52:25 得分 5
Lipperman在C++ Primer里说的很清楚了,C++虽然号称面向对象语言,但讽刺的是多态和虚函数只在使用指针或引用的情况下才起作用。你的
CShape Shape[6]={circle,ellipse,rect,shape,square,triamgle
};
里面全是对象实例,用实例调用虚函数当然没有用.Top
2 楼du51(郁郁思扬)回复于 2006-07-02 09:53:25 得分 5
那本书足以回答这个问题.你仔细看.(注意一下this指针和vptr)Top
3 楼winks(少爷)回复于 2006-07-02 10:44:57 得分 5
//from triace_zhang(『雪梨码头』) :
Lipperman在C++ Primer里说的很清楚了,C++虽然号称面向对象语言,但讽刺的是多态和虚函数只在使用指针或引用的情况下才起作用。
呵呵Top
4 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-02 12:20:08 得分 5
呵呵,实例访问成员,
实际上就是显式调用成员函数,
多态是不起作用的 ....
以指针方式才有效...Top
5 楼fdimim(猿莫求愚√))回复于 2006-07-02 13:21:32 得分 0
有收获,所以不要给我分Top




