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

在C++ 中,虚函数可以很好的实现多态,然而也有一定的局限,这个局限在于,虚函数必须在基类中定义,哪怕是空的实现。

例如下面这段代码编译时就会出错:

class Base
{
	virtual void print();
};

class Derived:Base
{
	void print()
	{
		cout << "Derived" <<endl;
	}
};

因为Base类中的虚函数print()没有定义。

而在实际编程时我们往往会遇到无法给基类的函数定义的情况,例如,我们以图形作为基类,圆形,长方形,正方形等都是其派生类,并且设计一个成员函数来求图形面积。

double GetArea();

那么在基类图形没有被继承的时候,我们无法给出 " 图形" 的面积定义,这时我们可以将求面积的函数定义为纯虚函数,这样,它在基类中就只需要声明而不需要定义。

定义纯虚函数的方法是在 函数的后面加上 =0 。

例如如下代码实现图形的基类:

class Graph
{
public:
	virtual double GetArea() const = 0; // 定义纯虚函数
};

class Circle:Graph
{
public:
	Circle():radius(0){}
	Circle(double _radius):radius(_radius){}
	double GetArea()                            //派生类中实现纯虚函数
	{
		return 3.14 * radius * radius;
	}
private:
	double radius;

};
class Rectangle:Graph
{
public:
	Rectangle():width(0),height(0){}
	Rectangle(double _width, double _height):width(_width),height(_height){}
	double GetArea()
	{
		return width * height;
	}
private:
	double width,height;
};

  

如果一个类含有纯虚函数,那么这个类就成为抽象基类,抽象基类无法创建具体的对象,所以你无法定义一个 ”图形“ 的对象。你只能定义出它的派生类,圆形,长方形,正方形等。

而还有一点要注意的就是,如果某个类继承自一个抽象基类但是没有将抽象基类中的所有纯虚函数都定义了,那么这个类仍然是一个抽象基类。

例如:

class ABC
{
    virtual void fun1() = 0;
    virtual void fun2() = 0;  //定义了两个纯虚函数
}

class Derived : ABC
{
    void fun1()
    {
        cout << "fun1" <<endl;    // 只实现了一个纯虚函数
    }
};
int main()
{
    Derived d1; // 编译报错,无法用抽象基类实例化对象
    return 0;
}

纯虚函数算是对虚函数的一个补充,我们可以利用它来方便的帮助我们实现需求。

时间: 2024-10-20 14:09:12

C++ 纯虚函数与抽象基类的相关文章

纯虚函数与抽象基类

这一节我们主要介绍一下抽象基类与纯虚函数的关系 首先,我们来看看纯虚函数 1.纯虚函数的定义   纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法.在基类中实现纯虚函数的方法是在函数原型后加"=0".如下     virtual void funtion()=0 2.定义纯虚函数的目的和意义 定义纯虚函数是为了实现一个接口,起到一个规范的作用.纯虚函数的意义在于:让所有的类对象(主要是派生类对象)都可以执行纯虚函数的动作,但类无法为纯虚函数提供

虚函数的使用 以及虚函数与重载的关系, 空虚函数的作用,纯虚函数-&gt;抽象类,基类虚析构函数使释放对象更彻底

为了访问公有派生类的特定成员,可以通过讲基类指针显示转换为派生类指针. 也可以将基类的非静态成员函数定义为虚函数(在函数前加上virtual) 1 #include<iostream> 2 using namespace std; 3 4 class base{ 5 public: 6 /*virtual*/ void who(){ //define this function to virtual will be normal 7 cout << "this is th

简单工厂类,有继承、虚函数重写、基类指针指向子类对象会发生多态(1)

class Fruit { public: virtual void get_fruit() { std::cout<<"Fruit:getFruit"<<std::endl; } }; class Pear : public Fruit { public: virtual void get_fruit() { std::cout<<"Pear:getFruit"<<std::endl; } }; class Bana

OOP2(虚函数/抽象基类/访问控制与继承)

通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当某个虚函数通过指针或引用调用时,编译器产生的代码直到运行时才能确定应该调用哪个版本的函数.被调用的函数是与之绑定到指针或引用上的对象的动态类型相匹配的那一个 注意:动态绑定只有当我们通过指针或引用调用虚函数时才会发生.当我们通过一个具有普通类型(非引用非指针)的表达式调用虚函数时,在编译时就会将调用

纯虚函数与虚基类

纯虚函数 1.定义 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法.在基类中实现纯虚函数的方法是在函数原型后加"=0" virtual void funtion()=0: 虚函数的定义是:virtual void funtion(): 2.引入原因: 1.为了方便使用多态特性,我们常常需要在基类中定义虚函数. 2.但在很多情况下,基类本身生成对象是不合情理的.例如,动物作为一个基类可以派生出老虎.孔雀等子类,但动物本身生成对象明显不合常理.

C++基础知识 基类指针、虚函数、多态性、纯虚函数、虚析构

一.基类指针.派生类指针 父类指针可以new一个子类对象 二.虚函数 有没有一个解决方法,使我们只定义一个对象指针,就可以调用父类,以及各个子类的同名函数? 有解决方案,这个对象指针必须是一个父类类型,我们如果想通过一个父类指针调用父类.子类中的同名函数的话,这个函数是有要求的: 在父类中,eat函数声明之前必须要加virtual声明eat()函数为虚函数. 一旦某个函数被声明为虚函数,那么所有派生类(子类)中eat()函数都是虚函数. 为了避免你在子类中写错虚函数,在C++11中,你可以在函数

C++虚函数和纯虚函数

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

虚函数和纯虚函数的区别

首先:强调一个概念定义一个函数为虚函数,不代表函数为不被实现的函数.定义他为虚函数是为了允许用基类的指针来调用子类的这个函数.定义一个函数为纯虚函数,才代表函数没有被实现.定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数.1.简介假设我们有下面的类层次: class A { public: virtual void foo() { cout<<"A::foo() is called"<<endl; } }; class

抽象类与纯虚函数

          一.啥是抽象类? 含有纯虚函数的类被称为抽象类.抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承结构的上层.抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为受保护的访问控制权限. 抽象类的主要作用就是描述一组相关子类的通用操作接口.一般而言,抽象类只描述这组子类共同的操作接口,而实现交给子类来完成. 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出.如果派生类没有重新定义纯虚函数,而派生类只是继承基类的纯虚函数,则这个派