抽象类(含纯虚函数)为什么不能实例化

回顾概念
  1. 所有函数(虚函数、静态成员函数、普通成员函数)的內存代码区(编译时就确定好了),运行全是在栈区

  2. 成员函数中含有纯虚函数函数的类叫抽象类,抽象类是不能够创建对象的,但可以创建指针和引用

    (即用派生类指针给基类指针赋值,或者基类引用派生类对象)

    //A为抽象类,B是A的派生类,B中已经重写了纯虚函数
    B b;
    
    //指针
    A *a = &b;
    //或者
    A *a = new B;
    
    //引用
    A &a = b;
    //或者
    A &p = *(new B);
    
  3. 抽象类的派生类没有重写纯虚函数(实现该函数的函数体),子类还是抽象类,也不可以创建对象。

纯虚函数定义

虚函数没有函数体就是纯虚函数,可以将虚函数声明为纯虚函数

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

最后的=0并不表示函数返回值为0,它只起形式上的作用,告诉编译系统,该函数无函数体,即这是纯虚函数。

包含纯虚函数的类称为抽象类(Abstract Class)。之所以说它抽象,是因为它无法实例化,也就是无法创建对象。

抽象类为什么不可以实例化?

如果你想要定义一个类对象,那么这个类必须是一个具体的类,也就是说,它必须实现了所有的成员函数,包括虚函数。只有这样,才能在程序中创建该类的对象。

原因很明显,纯虚函数没有函数体,不是完整的函数,无法调用,也无法为其分配内存空间。

抽象类通常是作为基类,让派生类去实现纯虚函数。派生类必须实现纯虚函数才能被实例化。

关于纯虚函数的几点说明
  1. 一个纯虚函数就可以使类成为抽象基类,但是抽象基类中除了包含纯虚函数外,还可以包含其它的成员函数(虚函数或普通函数)和成员变量。

  2. 只有类中的虚函数才能被声明为纯虚函数,普通成员函数和全局函数均不能声明为纯虚函数。

    普通成员函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数;虚函数为了重载和多态的需要,在基类中定义的,即便定义为空;纯虚函数是在基类中声明的虚函数,它可以在基类中有定义,且派生类必须定义自己的实现方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值