在定义和实现COM接口时,纯虚函数有不可替代的作用。
举个例子,可能有些牵强,但是能说明问题。
比如,我有一个类Animal,维护了一种动物形象,现在我要实现一个函数Draw,把这个动物画到任意一种介质上,这种介质可能是屏幕也可能是位图,当然,在屏幕和位图上画图形肯定是不一样的,那么,我的Draw函数肯定要有一个介质参数,每种介质对应一个版本的Draw函数,这样很麻烦,有了纯虚函数,就完全可以定义一个抽象类,以这个抽象类为参数,只写一个版本的Draw函数就可以了。
这个抽象类就是把在屏幕和位图上的绘图行为抽象出来,有点类似GDI+中的Graphics类(但它不是个抽象类)的概念,这个类定义有DrawRect和DrawText等纯虚函数,但是不去实现它,而是让针对屏幕绘图的子类和针对位图绘图的子类去实现这些函数。
这样所有像Animal的成员函数Draw那样,需要绘图的函数,都只需要有一个抽象类的指针或者引用,就可以绘图了,这就是纯虚函数的意义。
再举个伪代码的例子:
class Animal
{
public:
virtual SayHi() = 0; //无法实现,也没有必要实现。当然写个空的虚函数也行,但是万一我的函数需要返回值怎么办?强行写个返回值?C++的设计者当然不会允许这种情况出现。
完全可以没有数据成员,因为本来它就是抽象的类,其实也就是接口。
};
class Dog : public Animal
{
public:
virtual SayHi() { cout << lang; }
private:
string lang = "wang wang";
};
class Cat : public Animal
{
public:
virtual SayHi() { cout << "miao miao"; }
};
//虽然抽象类不能实例化,但是可以用它的引用或者指针,这就是纯虚函数能被利用的关键
这个函数只需要个动物参数,而动物类的所有函数在没有被具体到或者说继承到某个动物身上时是无法被实现的,但是所有的具体动物都可以作为参数传给我的函数,而且只要是动物传进来,不管是什么动物,我的函数都能正常的工作,这就是纯虚函数或者说抽象类的意义。
void WhatAnimal(Animal &a)
{
a.SayHi();
}
class C
{
Animal *a;
};
来自百度:http://zhidao.baidu.com/question/157219602.html?qbl=relate_question_3&word=%B4%BF%D0%E9%B7%BD%B7%A8%D3%D0%CA%B2%C3%B4%D7%F7%D3%C3