一、虚函数表原理
陈皓的一篇blog讲的很透彻:http://blog.csdn.net/haoel/article/details/1948051/
虚函数表可以分为:单一继承无虚函数覆盖、单一继承有虚函数覆盖、多重继承无虚函数覆盖和多重继承和有虚函数覆盖。
注意与虚拟继承区分开来
二、多态实现原理
多态则是通过继承、虚函数(virtual)、指针来实现。
class A {
public:
virtual void func() const {
coust << “A::func()” << endl;
}
}
class B : public A {
public:
virtual void func() const {
coust << “B::func()” << endl;
}
}
使用:
A a* = B();
a->func();
输出:
B::func()三、多态带来的内存泄露问题
class TimeKeeper
{
public:
TimeKeeper();
~TimeKeeper();
};
class AtomicClck : public TimeKeeper //原子钟
{ };
class WaterClck : public TimeKeeper //水钟
{ };
class WristClck : public TimeKeeper //腕表
{ };
int main()
{
TimeKeeper * ptk = getTimeKeeper() ; //工厂方法获取钟的对象
delete ptk ; //由于父类中的析构函数声明为非virtual,所以只会执行父类的析构函数
//这样就会造成子类中特有成员内存泄露
}
书中没说透:delete或者free是按照 基类对象地址+基类大小释放内存的,所以造成子类特有部分的内存泄露。
四、解决方法:为基类析构函数加virtual
class TimeKeeper
{
public:
TimeKeeper();
virtual ~TimeKeeper();
};原理:
子类的虚函数表中既有基类的析构函数,又有子类的析构函数,没有覆盖,所以都会被调用,对应于(一)中的单一继承无覆盖情况。
effective c++ 条款07(为多态基类声明virtual析构函数)整理
原文地址:http://blog.csdn.net/hustyangju/article/details/41547411