effective c++条款34:区分接口继承和实现继承

版权声明:转载请注明出处,谢谢!!! https://blog.csdn.net/qhdhnbd110/article/details/83930259

1. 纯虚函数也可以有具体实现

#include <iostream>
using namespace std;
class Airplane
{
public:
	virtual void fly(const char *)const = 0;
};
void Airplane::fly(const char *Goal) const
{
	cout << "Model goto " << Goal << endl;
}
class ModelA : public Airplane
{
public:
	virtual void fly(const char *goal)const
	{
		Airplane::fly(goal);
	}
};
class ModelB : public Airplane
{
public:
	virtual void fly(const char *goal)const
	{
		//B的自定义实现
	}
};
int main()
{
	Airplane *A = new ModelA;
	A->fly("China");
	A->Airplane::fly("China");
	return 0;
}

        我们都知道,非纯虚函数的作用是为了让子类继承该接口并且可以选择其父类中的默认实现(继承)和子类的自定义实现(覆盖),有些时候,对于某些需要实现覆盖的子类我们可能忘记了覆盖,而直接继承了父类的默认实现。为了防止遗忘,我们可以强制子类必须重新实现,如果想要默认实现只需调用父类中的默认函数即可。       

        我们可以调用父类中的纯虚函数,只需要加上作用域即可,利用这一特性,可以使纯虚函数成为默认函数,在父类中添加其具体实现。如果子类只需要该函数的默认实现方式,可以直接调用父类中的纯虚函数。

猜你喜欢

转载自blog.csdn.net/qhdhnbd110/article/details/83930259