一 概念区分
父子类具有同名函数
父类具有虚函数
父类具有纯虚函数
二 对比实现
2.1 同名函数和虚函数对比
1 虚函数在采用父类指针指向不同类型时,调用同名函数仍然是调用父类函数,但调用虚函数时调用的是子类重写函数。
2 父类采用引用或者指针指向子类时才能实现动态多态的效果。
class ParentClass
{
public:
void sameName();
virtual void virtualFunc();
};
class SonClass : public ParentClass
{
public:
void sameName();
void virtualFunc();
};
SonClass son = SonClass();
ParentClass parent = ParentClass();
parent = son;
parent.sameName(); // parent
parent.virtualFunc(); // parent
ParentClass* parent2 = new ParentClass();
parent2 = &son;
parent2->sameName(); // parent
parent2->virtualFunc(); // son
2.2 虚函数和纯虚函数对比
1 虚函数和纯虚函数重写时都可以使用ovverrird进行修饰,也可以省略,但普通函数不可以使用。
2 包含纯虚函数的类无法包含其它类型的函数,成为抽象类。
3 抽象类无法实例化对象,抽象类通常只包含纯虚函数,因为抽象类无法创建对象进行调用相关函数。
4 抽象类通常是当作接口进行使用的,类似于OC中的协议
class ParentClass
{
public:
virtual void pureVirtualFunc() = 0;
};
class SonClass : public ParentClass
{
public:
void pureVirtualFunc() override;
};
参考文献: