关于纯虚函数

在定义和实现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

时间: 2024-11-18 19:44:29

关于纯虚函数的相关文章

C++:纯虚函数与抽象类

5.4.3 纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,但是要求在派生类中根据需要对它进行定义,或仍然说明为纯虚函数. 声明纯虚函数的一般格式是: virtual 函数类型 函数名(参数表)=0: 纯虚函数的作用是:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行重新定义.纯虚函数没有函数体,它最后面“=0 ”并不表示函数的返回值是0,它只是形式上的作用,告诉编译系统这是纯虚函数.纯虚函数不具有函数的功能,不能被调用. //应用举例 #includ

C++抽象类与纯虚函数实战举例

虚函数与纯虚函数请参考:http://blog.csdn.net/hackbuteer1/article/details/7558868 #include <iostream> using namespace std; class Animal { public:     virtual void eat()=0;     virtual void sleep()=0; }; class Cat:public Animal { public:     void eat()     {     

C++ 虚函数,纯虚函数的一些问题

#include <iostream> using namespace std; #define cendl cout << endl; class AA{//这是一个纯虚函数 public : virtual void fun() = 0; }; class A{ int data_a; public: A(){ data_a = 1; cout << "A " ; } A(int a){ data_a = a; cout << &qu

C++:抽象基类和纯虚函数的理解

转载地址:http://blog.csdn.net/acs713/article/details/7352440 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ⑴抽象类的定义: 称带有纯虚函数的类为抽象类. ⑵抽象类的作用: 抽象类的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作.所以派生类实际上刻画了一组子类的操作接口的通用语义,这些语义也传给子类,子类可以具体实现这些

c++中虚函数和纯虚函数定义

只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数. 根据什么考虑是否把一个成员函数声明为虚函数? ①  看成员函数所在的类是否会作为基类 ② 看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能的,一般应该

虚函数和纯虚函数的作用与区别

http://blog.csdn.net/xwpc702/article/details/8670025 虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数!纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!虚函数引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数.class Cman{public:virtual void Eat(){……};void Move();private:};class C

C++ 虚函数与纯虚函数 浅析

[摘要] 本文首先简述虚函数与纯虚函数的定义,然后分析比较两者的区别与联系(DWS). [正文] 1)虚函数与纯虚函数有什么区别? 虚函数,不代表函数为不被实现的函数,为了允许用基类的指针来调用子类的这个函数:允许被其子类重新定义的成员函数. 纯虚函数,才代表函数没有被实现,为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数. 2)虚就虚在所谓"推迟联编"或者"动态联编"上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的.

C++虚函数和纯虚函数

只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数. 根据什么考虑是否把一个成员函数声明为虚函数? ①  看成员函数所在的类是否会作为基类 ② 看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能的,一般应该

C++中虚函数和纯虚函数的作用与区别-详解

虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数. class Cman { public: virtual void Eat(){--}; void Move(); private: }; class CChild : public CMan { public: virtual void

纯虚函数也可以有内容,并被子类调用

#include <iostream.h> class base { public: virtual void v() const = 0; virtual void f() const = 0 { // 纯虚函数也有实现内容,但子类仍然必须实现这个虚函数 cout << "base::f()\n"; } }; void base::v() const { cout << "base::v()\n";} // 实现函数写在类的外部