C++基础系列(二)纯虚函数
一. 概念
纯虚函数(pure virtual function)是指被标明为不具体实现的虚拟成员函数。它用于这样的情况:定义一个基类时,会遇到无法定义基类中虚函数的具体实现,其实现依赖于不同的派生类。
二. 定义
定义纯虚函数的一般格式为:
virtual 返回类型 函数名(参数表)=0;
含有纯虚函数的基类是不能用来定义对象的。纯虚函数没有实现部分,不能产生对象,所以含有纯虚函数的类是抽象类。
定义纯虚函数必须注意:
1 定义纯虚函数时,不能定义虚函数的实现部分。即使是函数体为空也不可以,函数体为空就可以执行,只是什么也不做就返回。而纯虚函数不能调用。
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声明)