C++语法|虚函数与多态详细讲解(七)|理解抽象类?(面试向)

系列汇总讲解,请移步:
C++语法|虚函数与多态详细讲解系列(包含多重继承内容)

主要是两个问题:

  • 抽象类和普通类有什么区别?
  • 一般把什么类处理处理成抽象类

在这里,案例我们仍然沿用上篇文章的设计:虚函数与多态详细讲解(六)|如何解释多态?(面试向)
代码如下:

#include <iostream>
#include <string>
using namespace std;

class Animal {
public:
    Animal(string name) : _name(name) {}
    virtual void bark() {}
protected:
    string _name;
};

class Cat : public Animal {
public:
    Cat(string name) : Animal(name) {}
    void bark() { cout << _name << " bark: miao miao !" << endl; }
};

class Dog : public Animal {
public:
    Dog(string name) : Animal(name) {}
    void bark() { cout << _name << " bark: wang wang !" << endl; }
};

class Pig : public Animal {
public:
    Pig(string name) : Animal(name) {}
    void bark() { cout << _name << " bark: heng heng !" << endl; }
};

void bark (Animal *p) { p->bark(); }

int main () {
	Cat cat("猫咪");
	Dog dog("二哈");
	Pig pig("佩奇");
	bark(&cat);
	bark(&dog);
	bark(&pig);
}

在这里,我们的动物是一个基类。我们需要明确,定义Animal的初衷,并不是让Animal抽象某个实体的类型。
主要有以下两个好处:

  1. string _name; 让所有的动物实体类通过继承Animal直接复用该属性
  2. virtual bark()给所有的派生类保留统一的覆盖/重写接口
    这样设计是为了符合软件设计的开闭原则。
class Animal {
public:
    Animal(string name) : _name(name) {}
    virtual void bark() {}
protected:
    string _name;
};

在这里,我们根本就不知道如何实现bark()函数,因为Animal本来就不是为了抽象某个实体类型,所以我们写:

    virtual void bark() {} = 0;

这个就叫纯虚函数,所以现在我们可以引出抽象类的概念:拥有纯虚函数的类叫做抽象类

我们的抽象类不能再实例化对象了,但是可以定义指针和引用变量(这是多态的基础)

总结1:抽象类和普通类有什么区别?
定义某一个基类,并不是让该类抽象某个实体的类型。
主要是以下两个目的:

  1. string _name; 让所有的动物实体类通过继承Animal直接复用该属性
  2. virtual bark()给所有的派生类保留统一的覆盖/重写接口
    这样设计是为了符合软件设计的开闭原则。
    所以我们把其中的虚函数定义为纯虚函数,构造一个抽象类,使其不能再实例化对象了,但是可以定义指针和引用变量(这是多态的基础)

总结2:一般把什么类作为抽象类?
基类!

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值