系列汇总讲解,请移步:
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抽象某个实体的类型。
主要有以下两个好处:
- string _name; 让所有的动物实体类通过继承Animal直接复用该属性
- virtual bark()给所有的派生类保留统一的覆盖/重写接口
这样设计是为了符合软件设计的开闭原则。
class Animal {
public:
Animal(string name) : _name(name) {}
virtual void bark() {}
protected:
string _name;
};
在这里,我们根本就不知道如何实现bark()函数,因为Animal本来就不是为了抽象某个实体类型,所以我们写:
virtual void bark() {} = 0;
这个就叫纯虚函数,所以现在我们可以引出抽象类的概念:拥有纯虚函数的类叫做抽象类。
我们的抽象类不能再实例化对象了,但是可以定义指针和引用变量(这是多态的基础)
总结1:抽象类和普通类有什么区别?
定义某一个基类,并不是让该类抽象某个实体的类型。
主要是以下两个目的:
- string _name; 让所有的动物实体类通过继承Animal直接复用该属性
- virtual bark()给所有的派生类保留统一的覆盖/重写接口。
这样设计是为了符合软件设计的开闭原则。
所以我们把其中的虚函数定义为纯虚函数,构造一个抽象类,使其不能再实例化对象了,但是可以定义指针和引用变量(这是多态的基础)总结2:一般把什么类作为抽象类?
基类!