C++基础系列(二)纯虚函数

一. 概念

        纯虚函数pure virtual function)是指被标明为不具体实现的虚拟成员函数。它用于这样的情况:定义一个基类时,会遇到无法定义基类中虚函数的具体实现,其实现依赖于不同的派生类。

二. 定义

定义纯虚函数的一般格式为:

virtual 返回类型 函数名(参数表)=0

含有纯虚函数的基类是不能用来定义对象的。纯虚函数没有实现部分,不能产生对象,所以含有纯虚函数的类是抽象类。

定义纯虚函数必须注意:

定义纯虚函数时,不能定义虚函数的实现部分。即使是函数体为空也不可以,函数体为空就可以执行,只是什么也不做就返回。而纯虚函数不能调用。

2     “=0”表明程序员将不定义该函数,函数声明是为派生类保留一个位置。“=0”本质上是将指向函数体的指针定为NULL

3   在派生类中必须有重新定义的纯虚函数的函数体,这样的派生类才能用来定义对象。

三. 理解

#include <iostream>
#include <string>

using namespace std;

class Shape {
    public:
        //虚函数
        virtual float area() const {return 0.0;}
        //虚函数
        virtual float volume() const {return 0.0;}

        //纯虚函数
        virtual void shapeName() const = 0;

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

        // 1. 纯虚函数没有函数实体  
        // 2. 最后“=0” 并不表示函数返回值为0, 它只起形式上的作用告诉编译系统“这是纯虚函数” 
        // 3. 这是一个声明语句,最后应该有分号

        // 纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义
        // 如果在基类中没有保留函数的名字,则无法实现多态性

        // 如果在一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该虚函数在派生类中任然为纯虚函数

        //  C++ 中的抽象类 : 这种不用来定义对象而只作为一种基本类型用作继承的类,称谓抽象类(abstract class)
        //  由于它常作为基类, 通常称谓抽象基类(abstract base class) 凡是包含纯虚函数的的类都是抽象类。

        //为什么呢?
        // 因为纯虚函数是不能被调用的,包含纯虚函数的类是无法建立对象的
        // 抽象类的作用?
        // 抽象类的作用是作为一个类族的共同基类, 或者说 为一个类族提供一个公共接口

        //如果在基类声明了虚函数,则在派生类中凡是与该函数有相同的函数名,函数类型,参数个数和类型的函数 均为虚函数(不论在
        //派生类中是否用Virtual声明)

};


//声明 Point类 共有继承 Shape类
class Point : public Shape {
    public:
        Point(float=0, float=0);
        void setPoint(float, float);
        float getX() const {return x;}
        float getY() const {return y;}

        //纯虚函数
        virtual void shapeName() const {
             cout<< "Point " <<endl ;  //仅仅输出类的名称
        }

    protected:
        float x, y;
};


Point::Point(float a, float b) {
    x = a;
    y = b;
}

void Point::setPoint(float a, float b) {
    x = a;
    y = b;
}

1. 纯虚函数没有函数实体  


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


3. 这是一个声明语句,最后应该有分号

4. C++ 中的抽象类 : 这种不用来定义对象而只作为一种基本类型用作继承的类,称谓抽象类(abstract class)由于它常作为基类, 通常称谓抽象基类(abstract base class)

   抽象类的作用:是作为一个类族的共同基类, 或者说为一个类族提供一个公共接口

5. 凡是包含纯虚函数的的类都是抽象类  为什么呢?

    答:因为纯虚函数是不能被调用的,包含纯虚函数的类是无法建立对象的

6. 如果在基类声明了虚函数,则在派生类中凡是与该函数有相同的函数名,函数类型,参数个数和类型的函数 均为虚函数(不论在派生类中是否用Virtual声明)