示例1:
class CBase
{
virtual void Fun1() const {};
};
class CDrived : public CBase
{
virtual void Fun1() {};
};
分析:CDrived::Fun1不是继承自CBase的虚函数了,而是一个新的虚函数,因为上下两个函数的声明不一样——下面函数声明后面没有const.要想重新实现基类的虚函数,虚函数的声明必须和基类保持完全一致,否则只会产生一个新的虚函数.
示例2:
class CBase
{
public:
virtual ~CBase() {}
};
class CDrived : public CBase
{
public:
virtual ~CDrived() {}
};
分析:当new出来的一个对象被delete的时候,析构函数就会被调用.析构函数被声明为虚的,是为了适用于以下情况:
CDrived* pDrivedObj = new CDrived();
CBase* pBaseObj = dynamic_case<CBase*>(pDrivedObj);
...
delete pBaseObj;
要要是析构不声明为虚函数,因为pBase是CBase*类型,编译器在delete的时候就会调用CBase的析构函数;
要是析构声明为虚函数,编译器在delete的时候就会用虚函数的调用方式去调用pBase指针所指对象的真正虚构函数.
示例3:
class CBase
{
virtual void Fun1() const = 0 {};
};
分析:类的纯虚函数作用是禁止创建该类的对象,同时也作为一个虚函数,子类可以继承并重新实现这个虚函数.