C++抽象类(纯虚函数)

C++抽象类

一、纯虚函数定义.

纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”

二、引入原因:

  1. 为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。
  2. 在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
    为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重载以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。

三、相似概念:

  1. 多态性
    指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。
    编译时多态性: 通过函数重载和运算符重载来实现的。
    运行时多态性: 通过继承和虚函数来实现的。
  2. 虚函数
    虚函数是在基类中被声明为virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态重载
    纯虚函数的声明有着特殊的语法格式: virtual 返回值类型成员函数名(参数表)=0;
    请注意,纯虚函数应该只有声明,没有具体的定义,即使给出了纯虚函数的定义也会被编译器忽略。
  3. 抽象类
    包含纯虚函数的类称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象。
    在C++中,我们可以把只能用于被继承而不能直接创建对象的类设置为抽象类(Abstract Class)。

之所以要存在抽象类,最主要是因为它具有不确定因素。我们把那些类中的确存在,但是在父类中无法确定具体实现的成员函数称为纯虚函数。纯虚函数是一种 特殊的虚函数,它只有声明,没有具体的定义。抽象类中至少存在一个纯虚函数;存在纯虚函数的类一定是抽象类。存在纯虚函数是成为抽象类的充要条件。

程序举例:

//基类:
class A
{
public:
    A();
    void f1();
    virtual void f2();
    virtual void f3()=0;
    virtual ~A();
};

//子类:
class B : public A
{
public:
    B();
    void f1();
    void f2();
    void f3();
    virtual ~B();
};

//主函数:
int main(int argc, char* argv[])
{
    A *m_j=new B();
    m_j->f1();
    m_j->f2();
    m_j->f3();
    delete m_j;
    return 0;
}
/*
f1()是一个普通的重载.
调用m_j->f1();会去调用A类中的f1(),它是在我们写好代码的时候就会定好的.因为f1()不是虚函数,不会动态绑定
也就是根据它是由A类定义的,这样就调用这个类的函数.
f2()是虚函数.
调用m_j->f2();会调用m_j中保存的对象中,对应的这个函数.这是由于new的B对象.
f3()与f2()一样,只是在基类中不需要写函数实现.
*/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • C++虚函数 C++虚函数是多态性实现的重要方式,当某个虚函数通过指针或者引用调用时,编译器产生的代码直到运行时才...
    小白将阅读 5,664评论 4 19
  • 注意:本文中代码均使用 Qt 开发编译环境 虚函数是动态联编的基础。虚函数必须是基类的非静态成员函数,其访问权限可...
    赵者也阅读 5,891评论 0 2
  • 参考来源:知乎 定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的...
    夜幕青雨阅读 4,260评论 0 6
  • 这篇文章的思绪,是断断续续的,无非是每天想到什么,就在备忘录里记下来。今天丹霞突然说我好几天没有给她文字了,我才想...
    帅帅的荣狗狗阅读 2,187评论 0 1
  • 今天翻看前段时间播出的《向往的生活》,看到李冰冰和任泉来的那一期,当何老师和任泉聊到冰冰男朋友时,说了这么一句话。...
    Fenggg_阅读 9,668评论 0 1