条款34:区分接口继承和实现继承

结论1:接口继承和实现继承不同。在public继承之下,derived classes总是继承base classes的接口。

public继承由两部分组成:函数接口继承和函数实现继承。

结论2:pure virtual函数只具体指定接口继承。

pure virtual函数有两个最突出的特性:它们必须被任何继承了它们的具体class重新声明,而且它们在抽象class中通常没有定义。声明一个pure virtual函数而没有定义目的是为了让derived只继承函数接口。

结论3:简朴的(非纯)impure virtual函数具体指定接口继承和缺省实现继承。

impure virtual具体指定的缺省实现在derived class未明确说出“我要”的情况下就已经被继承了。为了实现“提供缺省实现给derived classes,但需要derived classes明确要求”,需要切断“virtual函数接口"和其”缺省实现“之间的连接。例如:

class Airplane {
public:
        virtual void fly(const Airport& destination) = 0;
        ...
protected:
        void defaultFly(const Airport& destination);
};
void Airplane::defaultFly(const Airport& destination)
{
缺省行为,将飞机飞至指定目的地。
}
class ModelA:public Airplane {
public:
        virtual void fly(const Airport& destination)
        {defaultFly(destination);}
        ...
};
此外,还可以利用”pure virtual函数必须在derived class中重新声明,但也可以拥有自己的实现,调用时需要明确指出其class名称“这一事实,实现“提供缺省实现给derived classes,但需要derived classes明确要求”,例如:

class Airplane {
public:
	virtual void fly(const Airport& destination) = 0;
        ...
protected:
	void defaultFly(const Airport& destination);
};
void Airplane::fly(const Airport& destination)
{
缺省行为,将飞机飞至指定目的地。
}
class ModelA:public Airplane {
public:
	virtual void fly(const Airport& destination)
	{Airplane::fly(destination);}
        ...
};
这样做合并了fly 和 defaultFly,丧失了“让两个函数享有不同保护级别"的机会。

结论4:non-virtual函数具体指定接口继承以及强制性实现继承。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值