`

什么情况下应当声明虚函数?纯虚函数声明

阅读更多

注意:

只能用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数。因为虚函数的作用是允许在派生类中对基类的虚函数重新定义。所以只能用于类的继承层次结构中。

一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数。

根据什么考虑是否把一个成员函数声明为虚函数?

首先看成员函数所在的类是否会作为基类。然后看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能的,一般应该将它声明为虚函数。

如果成员函数在类被继承后功能不需修改,或派生类用不到该函数,则不要把它声明为虚函数。不要仅仅考虑到作为基类而把类中的所有成员函数都声明为虚函数。

应考试对成员函数的调用是通过对象名还是通过基类指针或引用去访问,如果是通过基类指针或引用去访问的,则应当声明为虚函数。

有时在定义虚函数时,并不定义其函数体,即空函数。它的作用只是定义了一个虚函数名,具体功能留给派生类去添加。

说明:使用虚函数,系统要有一定的空间开销。当一个类带有虚函数时,编译系统会为该类构造一个虚函数表,它是一个指针数组,存放每个虚函数的入口地址。系统在进行动态关联的时间开销很少,提高了多态性的效率。

一、虚析构函数

  析构函数的作用是在对象撤销之前把类的对象从内存中撤销。通常系统只会执行基类的析构函数,不执行派生类的析构函数。

  只需要把基类的析构函数声明为虚函数,即虚析构函数,这样就会撤销基类对象的同时撤销派生类的对象了,这个过程是动态关联完成的。

如果将基类的析构函数声明为虚函数时,由该基类所派生的所有派生类的析构函数都自动成为虚函数,即使派生类的析构函数与基类的析构函数名字不相同。

最好把基类的析构函数声明为虚函数。这将使所有派生类的析构函数自动成为虚函数,如果程序中显式delete运算符删除一个对象,而操作对象用了指向派生类对象的基类指针,系统会调用相应类的析构函数。

构造函数不能声明为虚函数。

 

一、纯虚函数

有时候,基类中的虚函数是为了派生类中的使用而声明定义的,其在基类中没有任何意义。此类函数我们叫做纯虚函数,不需要写成空函数的形式,只需要声明成:

    virtual float area()const=0;的形式即可。

一般形式:virtual 函数类型 函数名(形参表列)=0;

注意:纯虚函数没有函数体;

最后面的“=0“并不代表函数返回值为0,只是形式上的作用,告诉编译系统”这是纯虚函数”;

这是一个声明语句,最后应有分号。

纯虚函数只有函数的名字但不具备函数的功能,不能被调用。在派生类中对此函数提供定义后,才能具备函数的功能,可以被调用。

分享到:
评论

相关推荐

    C++中虚函数和纯虚函数区别[归类].pdf

    纯虚函数声明如下:virtual ReturnType FunctionName(Parameter)=0;纯虚函数一定没有定义,纯虚函数用来规范派生类的行为,即接口。包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的...

    xuhanshu.rar_C++虚函数_虚函数

    在C++编程语言中,虚函数(Virtual Function)是一个核心特性,它允许子类重写父类的方法,实现多态性。多态性是面向对象编程的三大特性之一,...在实际开发中,应当根据需求权衡虚函数带来的灵活性和潜在的性能影响。

    c讲稿Chapter6多态性与虚函数.pptx

    纯虚函数是在基类中声明但没有定义的虚函数,通常用`= 0`表示。含有纯虚函数的类被称为抽象类,不能直接实例化,但可以作为其他类的基类。派生类必须提供纯虚函数的实现,否则也将成为抽象类。抽象类主要用于定义...

    4.2C++之虚函数共5页.pdf.zip

    声明虚函数的关键字是`virtual`,它被放在函数声明的前面。 1. **虚函数的作用**: - **动态绑定**:虚函数使得函数调用可以在运行时决定,而不是在编译时确定。这允许程序根据对象的实际类型来执行相应的函数。 ...

    C++什么时候使用纯虚函数

    作者:王姗姗,华清远见嵌入式学院讲师。  通常在实现一个接口的时候使用纯虚函数。接口一般就是一个抽象类。...在这种情况下应当将area函数声明为虚函数。可以在基类point中加一个area函数,并声明为虚

    EDA/PLD中的C++什么时候使用纯虚函数

    通常在实现一个接口的时候使用纯虚函数。接口一般就是一个抽象类。  有时在基类中将某一成员函数定为虚函数,并不是基类本身...在这种情况下应当将area函数声明为虚函数。可以在基类point中加一个area函数,并声明为虚

    C++- 抽象类(存虚函数)、接口、多重继承1

    首先,抽象类是一种包含至少一个纯虚函数(virtual 函数声明但没有定义)的类。在C++中,这样的类不能被实例化,通常用作基类,为派生类提供公共的行为和属性。存虚函数的目的是确保即使基类没有实例,其派生类的...

    C++多态练习题.docx

    在C++中,关键字`virtual`用于声明虚函数。当基类中的某个函数被声明为虚函数时,它就开启了一个“虚函数表”(vtable),其中存储了虚函数的地址。派生类中的同名函数如果要覆盖基类的虚函数,需要在函数声明前加上...

    C++面试问与答攻略技巧

    **纯虚函数**是一种特殊的虚函数,其声明方式为在函数声明的末尾加上`= 0`。纯虚函数的主要目的是在基类中强制派生类提供特定的函数实现,通常用以定义接口规范。含有纯虚函数的类是抽象类,不能被实例化。 ```cpp ...

    程序员面试宝典——自己整理

    - **纯虚函数**:纯虚函数是在声明虚函数时没有给出任何实现,而是以`= 0`标记的虚函数。包含纯虚函数的类被称为抽象类,这类类不能被实例化,其主要作用是作为其他类的基类,以强制派生类必须实现纯虚函数。 - **...

    东师21春《C++程序设计》在线作业2_2参考答案.docx

    - **构造函数**和**拷贝构造函数**不能被声明为虚函数,因为它们不会在派生类中被调用(不支持多态)。 - **析构函数**可以声明为虚函数,这样可以确保当通过基类指针删除派生类对象时,会调用派生类的析构函数。 - ...

    C++基础知识简单汇总_终稿1061

    虚函数是实现多态的关键,它在基类中声明并在派生类中重定义。纯虚函数(virtual void func() = 0;)是一个没有实现的虚函数,用来定义抽象基类,强制任何派生类必须提供实现。 4. **new、delete、malloc、free关系...

    详解c++种gmock单元测试框架

    如果一个类中的函数没有被声明为虚函数(或纯虚函数),那么在单元测试中就无法使用gMock来模拟该函数的行为。 为了使用gMock,需要进行接口隔离设计。具体来说,应该采用纯虚函数(即接口)来定义类的行为,然后...

    12、13年房鸣C++考试要求及复习文档

    在面向对象编程中,多态性是核心概念之一,虚函数和纯虚函数的使用是实现多态的关键。考生需要了解如何通过指针或引用调用基类和派生类的成员函数,以及虚函数表的工作原理。 最后,对于13年的考试,可能涉及到STL...

    C++的静态联编和动态联编

    3. 析构函数可以且应当声明为虚的,以保证在继承层次中正确地销毁对象。 4. 虚函数表(vtbl)是C++实现动态联编的一种技术,它存储了类中虚函数的地址,调用虚函数时会通过vtbl找到对应的函数地址。 理解静态联编和...

    C++期末考试试卷与答案.docx

    16. 接口重用:C++通过虚函数实现接口重用,允许动态联编,使得子类可以覆盖父类的虚函数,实现多态性。 17. 公有继承:公有继承的派生类可以访问基类的公有和受保护成员,但不能直接访问私有成员。 18. 虚基类:...

    期中考试参考答案.docx

    11. **抽象类**:在C++中,不能定义对象的类称为抽象类,这样的类至少包含一个纯虚函数。 12. **const关键字的用途**:`const`对象不能被修改,`const`成员函数不能修改类数据成员。 13. **输入输出**:C++中使用...

    C++知识架构.pdf

    多态性则通过虚函数、纯虚函数和动态绑定来实现,允许将派生类对象当作基类对象来处理。 通过以上知识点的总结,我们可以对C++的面向对象编程有更深入的理解,从而在实际开发中更加高效和优雅地使用这门语言。

    八股文C++篇(超级全)-c++八股文.pdf

    - **析构函数**: 如果一个类中有虚函数,则其析构函数也应当声明为虚函数,以确保派生类的析构函数也能被正确调用。 ### 4. 类型转换 #### `static_cast` - **用途**: 用于在不同类型的变量之间进行安全转换。 - ...

Global site tag (gtag.js) - Google Analytics