(1)纯虚函数和抽象类的概念
如果一个类的虚函数后面写上=0
,同时不写它的实现,那么这样的虚函数称之为纯虚函数,包含纯虚函数的类则称之为抽象类
(2)抽象类的意义
如下代码中有一个,Animal
类,还有一个Dog
类和Tiger
类,他们内部都有三个构成重写的函数fun
,用于打印一句话,这句话描述了他们各自的特点。但是我们发现了,对于小狗和老虎这种具体的动物可以很容易用一些关键词描述出它们给我们的具体影响,但是对于动物这种宽泛的东西,无法具体描述。 那么这样的话,在父类的接口里面就没有去写这些代码了
class Animal
{
public:
virtual void fun() {
}
};
class Dog : public Animal
{
public:
void fun()
{
cout << "狗很可爱" << endl;
}
};
class Tiger : public Animal
{
public:
void fun()
{
cout << "老虎和凶残" << endl;
}
};
int main()
{
}
所以抽象类的就更体现了一种接口继承,所以我们可以把父类的虚函数定义为纯虚函数,父类的接口里面就不用去写实现了,而在子类中正常去写自己的实现
抽象类不能实例化对象,并且子类继承后也不能实例化对象,只有当子类明确的重写纯虚函数后,子类才能实例化对象。
所以,定义好纯虚函数后,我们仍然可以按照多态的方式各自调用各自的接口。
class Animal//抽象类
{
public:
virtual void fun() = 0;//纯虚函数
};
class Dog : public Animal
{
public:
void fun()
{
cout << "狗很可爱" << endl;
}
};
class Tiger : public Animal
{
public:
void fun()
{
cout << "老虎很凶残" << endl;
}
};
int main()
{
Dog dd;
Tiger tt;
Animal* d = ⅆ
Animal* t = &tt;
d->fun();//调用dog的
t->fun();//调用tiger的
}
(3)接口继承与实现继承
普通函数的继承属于实现继承,它所继承的是函数的实现。虚函数的继承属于接口继承,子类继承的是父类的接口,然后子类再在父类的接口上进行重写,以达到多态的目的。纯虚函数则更好的体现了接口的继承,另外如果不实现多态,就不要把函数定义为虚函数
转载:https://blog.csdn.net/qq_39183034/article/details/116672744
查看评论