想问下C++纯虚函数相比于虚函数的直接作用

就是想问下有什么功能是纯虚函数能实现而虚函数不能实现的功能!

在定义和实现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;
};
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-10-23

    虚函数和纯虚函数可以定义在同一个类中,含有纯虚函数的类被称为抽象类,而只含有虚函数的类不能被称为抽象类。

    虚函数可以被直接使用,也可以被子类重载以后,以多态的形式调用,而纯虚函数必须在子类中实现该函数才可以使用,因为纯虚函数在基类有声明而没有定义。

    虚函数和纯虚函数都可以在子类中被重载,以多态的形式被调用。

    虚函数和纯虚函数通常存在于抽象基类之中,被继承的子类重载,目的是提供一个统一的接口。

    虚函数的定义形式:virtual{};

    纯虚函数的定义形式:virtual  { } = 0;

    在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时要求前期绑定,然而虚函数却是动态绑定,而且被两者修饰的函数生命周期也不一样。



  虚函数充分体现了面向对象思想中的继承和多态性这两大特性,在C++语言里应用极广。比如在微软的MFC类库中,你会发现很多函数都有virtual关键字,也就是说,它们都是虚函数。难怪有人甚至称虚函数是C++语言的精髓。

  定义纯虚函数就是为了让基类不可实例化,因为实例化这样的抽象数据结构本身并没有意义或者给出实现也没有意义。

  纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。

  虚函数在子类里面也可以不重载的;但纯虚必须在子类去实现,这就像Java的接口一样。通常我们把很多函数加上virtual,是一个好的习惯,虽然牺牲了一些性能,但是增加了面向对象的多态性,因为你很难预料到父类里面的这个函数不在子类里面不去修改它的实现。

第2个回答  2010-06-03
比如说你要开发一个class A。你同事小明要开发一个class B : public A。class A里面有一个function叫getName。A是一个抽象里,并没有具体的空间保存name。这时候你有两个选择。
选择1:
class A {
public
virtual std::string getName() {} // 返回一个空函数。等子类来覆盖。
}

但是你的同事小明很粗心,总是忘记覆盖。结果导致class B调用的还是A::getName().

选择2:
class A{
public
virtual std::string getName() = 0; //纯虚函数,子类必须实现!
}

这样,无论小明多粗心。如果他的类里没有实现getName(),编译器会报错的。本回答被提问者采纳
第3个回答  2010-06-03
去看我的空间,里面很全。

想问下C++纯虚函数相比于虚函数的直接作用
\/\/虽然抽象类不能实例化,但是可以用它的引用或者指针,这就是纯虚函数能被利用的关键 这个函数只需要个动物参数,而动物类的所有函数在没有被具体到或者说继承到某个动物身上时是无法被实现的,但是所有的具体动物都可以作为参数传给我的函数,而且只要是动物传进来,不管是什么动物,我的函数都能正常...

c++中的纯虚函数与虚函数在应用上有什么差别??
2、另一方面,虚函数不提供实现,如果使用者试图实例化这个类,在编译阶段无法发现错误,必须等到链接阶段才能发现,而且链接错误也仅仅是“无法解析的外部符号”,这种错误提示很不明确,当错误较多时很难找到真正的原因。 而如果是纯虚函数则编译器在编译阶段就直接会报错,并且会在错误中明确告知使用者不...

C\/C++面试题:虚函数与纯虚函数有什么区别
(1)类里如果声明了虚函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖,这样的话,这样编译器就可以使用后期绑定来达到多态了。纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。(2)虚函数在子类里面也可以不重载的;但纯虚函数必...

C++中虚函数和纯虚函数的区别
1. 声明了虚函数的类,该函数是已实现的,即使为空实现。其作用是允许这个函数在子类中重写,以便编译器可以使用动态绑定实现多态(即父类指针指向子类对象,调用子类方法)。而纯虚函数只是在基类中的一个函数定义,即一个函数声明,具体的实现需要留到子类中。2. 虚函数在子类中也可以不进行重写(...

虚函数和纯虚函数的区别和作用
虚函数可以用来实现多态,可以根据调用对象的实际类型,而不是根据声明类型来调用适当的函数。这样可以有效地实现代码的重用,避免了重复编码。纯虚函数可以用来实现抽象类,一个抽象类是指一个类中定义了至少一个纯虚函数的类。这样可以定义一个抽象的接口层,子类可以通过实现纯虚函数来实现抽象接口的不同...

虚函数和纯虚函数的区别和作用
虚函数的作用是“运行时多态”和重载,父类中提供虚函数的实现,为子类提供默认的函数实现;子类可以重写父类的虚函数实现子类的特殊化。虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstractclass),而只含有虚函数的类(class)不能被称为抽象类(abstractclass)。虚...

虚函数和纯虚函数的区别和作用
作用不同。虚函数的作用是“运行时多态”和重载,父类中提供虚函数的实现,为子类提供默认的函数实现;子类可以重写父类的虚函数实现子类的特殊化。纯虚函数是抽象类,包含纯虚函数的类称为抽象类,它只提供申明,不实现。函数简介:函数(function),数学术语。其定义通常分为传统定义和近代定义,函数...

C++考题中提到纯虚拟函数是什么概念?起什么作用?
virtual void funtion1()=0 引入原因\/纯虚函数的作用 为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。为了解决上述问题,引入了纯虚函数的概念,将函数定义为...

什么时候一定要使用虚函数而不能使用纯虚函数,请举实例。
虚函数主要是用来定义一个函数,且允许这个函数调用的时候,在可能的情况下调用派生类重载的函数。举一个实例的话,就是析构函数。父类可以有一个析构函数来处理父类里面分配的内存之类的事情,派生类也有一个析构函数来处理派生类中的相关事情。于是这就无法使用纯虚函数了。

c++中虚函数和纯虚函数有什么区别?
virtual void test(void);\/\/虚函数 virtual void test(void)= 0;\/\/纯虚函数 其次,如果一个类包含了一个纯虚函数(哪怕只有一个是纯虚函数),那么它就是一个抽象类——就是不能生成具体的对象!但如果类中只包含虚函数,那么是可以定义具体的对象的!但二者又有一个相同点:都必须在子类中...

相似回答