关于虚函数,在多态当中,一定要将基类的析构函数设置为虚函数并将其实现,只有这样,才能够达到按对象构造的逆序来析构对象;否则,析构的时候,只会析构基类的那一部分,那么派生类那一部分就无法成功析构了。



​class​​ ​​shape​


​{​


​public​​​​:​


​shape(){};​


​virtual​​ ​​void​​ ​​draw() = 0;​


​virtual​​ ​​~shape(){cout << ​​​​"shape destruction"​​ ​​<< endl;}​


​};​


​class​​ ​​rectangle : ​​​​public​​ ​​shape​


​{​


​public​​​​:​


​rectangle(){};​


​void​​ ​​draw()​


​{​


​}​


​~rectangle(){cout << ​​​​"rectangle destruction"​​ ​​<< endl;}​


​};​


​class​​ ​​round : ​​​​public​​ ​​shape​


​{​


​public​​​​:​


​round(){};​


​void​​ ​​draw()​


​{​


​}​


​~round(){cout << ​​​​"round destruction"​​ ​​<< endl;}​


​};​


​void​​ ​​main()​


​{​


​shape * s;​


​​



​s = ​​​​new​​ ​​rectangle();​


​s->draw();​


​delete​​ ​​s;​


​s = ​​​​new​​ ​​round();​


​s->draw();​


​delete​​ ​​s;​


​}​




§纯虚函数

在虚函数的中举了shape的例子,里面有个draw函数,但是如果具体去实现 的话,draw shape?这实现起来很模糊,如果将shape基类实例化的话,就搞不清draw什么了(画出乱七八糟的东西,这不是客户需要的东西,客户需要的是具体 的图形)。因此有必要在基类shape当中,将draw的定义(实现)除去,而将它的定义(实现)留给派生类。



​class​​ ​​shape​


​{​


​public​​​​:​


​shape(){};​


​virtual​​ ​​void​​ ​​draw()=0;    ​​​​//纯虚函数​


​};​


​class​​ ​​rectangle : ​​​​public​​ ​​shape​


​{​


​public​​​​:​


​rectangle(){};​


​void​​ ​​draw()​


​{​


​画方形;​


​}​


​};​


​class​​ ​​round : ​​​​public​​ ​​shape​


​{​


​public​​​​:​


​round(){};​


​void​​ ​​draw()​


​{​


​画圆形;​


​}​


​};​


​void​​ ​​main()​


​{​


​shape * s;​


​s = ​​​​new​​ ​​rectangle();​


​s->draw();​


​s = ​​​​new​​ ​​round();​


​s->draw();​


​} ​


看了上面的代码是不是很有感触,回忆起来了吧,C++里面的抽象类与java里 面的接口很类似,不过C++抽象类允许有成员变量的出现。没有谁强迫你说抽象类里面的方法不能在抽象类里面实现,但是如果你确实在抽象类里面实现了,那也 只是百搭,因为只有继承他的子类才能实现,C++只认这个,况且抽象类是不允许被实例化,所以你在抽象类里面实现纯虚方法(函数)是多余的。