"伪虚函数"示例

示例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 {};
};
分析:类的纯虚函数作用是禁止创建该类的对象,同时也作为一个虚函数,子类可以继承并重新实现这个虚函数.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值