多态的实现可以归结于———virtual关键字
1、虚基表
带有virtual关键字的class都有一个virtual table,该class的对象通常会带有一个vptr(virtual table ptr),该vptr决定了程序运行期间,各个virtual函数的调用情况。
下面举一个例子说明base class和derive class的virtual函数的继承关系对应子类对象中的virtual table。
将子类对象赋值给基类对象时,并通过基类对象调用子类的虚函数,这是工厂模式的实现方式。
(这里为什么要强调对象,是因为只有指针对象才有虚函数表。。。)
#include <iostream>
class Base1 {
public:
Base1();
virtual ~Base1();
virtual void f();
};
Base1::Base1() {
}
Base1::~Base1() {
}
void Base1::f() {
}
class Derive : public Base1 {
public:
Derive();
~Derive();
virtual void f();
};
Derive::Derive() {
}
Derive::~Derive() {
}
void Derive::f() {
std::cout << "Derive" <<std::endl;
}
int main() {
Derive* d = new Derive();
Base1* b = d;
b->f(); // 通过子类对象的基类类型指针调用子类实现的虚函数
}
输出: Derive
2、virtual 析构函数
通过1 的分析可以看出,若Base1 class中的析构函数不是虚函数,那么在基类对象b时将不会调用子类的析构函数,从而引发内存泄漏。
3.工厂模式—纯虚函数
纯虚函数个人感觉就是提供了一种遍历,即基类中的纯虚函数必须由子类实现,否则编译将报错。
所以很多时候我们将采用这种方式实现一种工厂模式。代码举例如下:
https://github.com/ty520/factory_example/blob/master/src/base_shape.h