一个关于虚函数的C++题目

一个关于虚函数的C++题目,第1张

修改如下握扮含:

#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(开放封闭原则),就可以用虚函数来做到。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11975940.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存