#include<stdio.h>
class Shape
{
public:
Shape(){}
~Shape(){}
virtual void draw()
{
printf( "Shape\n"缺老 )
}
private:
int n
}
class Circle : public Shape
{
public:
Circle(){}
void draw()
{
printf( "段笑Circle\n" )
}
}
class Square : public Shape
{
public:
Square(){}
void draw()
{
printf( "Square\n" )
}
}
class Triangle : public Shape
{
public:
Triangle(){}
void draw()
{
printf( "Triangle\n" )
}
}
void main()
{
Shape** pshape = new Shape*[3]
Circle c
Square s
Triangle t
pshape[0] = (Shape*)&c
pshape[1] = (Shape*)&s
pshape[2] = (Shape*)&t
pshape[0]->draw()
pshape[1]->draw()
pshape[2]->draw()
}
手动添加上去消衡闹就行了,可拦洞能是VC开发环境的一拿罩个bug。CTabCtrl::DrawItem
void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
虚函数的作用就是接口类能够提供协议(即这个接口的功能是什么,比如都是进行绘画,相对来说比较抽象),而各个子类可以给出具体不同的实现(比如长方形绘画时可以画出长方形,而三角形则画出来的就是三角形)。调用虚函数的客户只需要知道虚搏局函数的提供的协议,而不需要关心这个实现这个虚函数的到底是个什么类(因为都是从一个基类继承的)。
当然你可能会想,为什么不能用非虚函数做上面的事情,我们可以实现时指定一个类型,比如有一个成员用来标识形状的类型,而在实现时用这个类型来判定如何进行绘画,简而言之就是if else或者switch语句,如同下面的代码:
class shape {int type
public:
void draw() {
switch (type) {
case rectangle:
draw_rectangle()
break
case circle:
draw_circle()
break
}
}
这个问题在于,当你有一个很多shape时,这个switch case将难以管理,因为有时候代码中有些地方就是需要根据类型来做判断,但是此时你会倾向于使用switch case来实现这些代码。久而久之,一旦加个新类型时,就会很颤银罩难维护,因为要改动很多地方,就容易出错(当然如果改动地方不多,问茄闹题不会很大)。
但是如果使用虚函数实现,那么各个子类管理自己的实现,而有需要依据类型来判断的地方,可以通过虚函数来实现,因为每个类可以定制这种行为,对于draw而言,可以
class rectangle : public shape {public:
virtual void draw() {
// draw rectangle
}
}
class circle : public shape {
public:
virtual void draw() {
// draw circle
}
}
这样当我们需要加新shape的时候,只需要添加一个新的子类,实现draw(或者其他依赖于类型的函数时),就不用到处去修改那些swtich case语句了,也不容易出错了。
敏捷开发一书中,提到的OCP(开放封闭原则),就可以用虚函数来做到。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)