用C++模拟sealed和final关键字

本文探讨了C++中private继承的含义,它表示implemented-in-term-of关系,而非is-a关系。文章建议优先使用复合,但在涉及protected成员或virtual函数时考虑private继承。通过示例展示了如何通过private继承模拟Java的final和C#的sealed特性,以限制派生类的功能并降低编译依赖性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++通过public继承视为is-a关系。那么private继承意味着什么呢?


如果classes之间的继承关系是private,编译器不会自动将一个derived class对象转换为一个base class对象。这和public继承不同。第二条规则是,由private base class 继承而来的所有成员,在derive class中都会变成private属性,纵使他们在base class中原本是protected 或者 public属性。


Private继承以为这implemented-in-term-of。通过private继承可以让derived class采用基类已经具备的某些属性,他们之间可以并不存在任何观念上的关系。private继承纯粹只是一种实现技术,它在软件“设计”层面上没有太多意义,其意义只及于软件实现层面。


private继承意味着implemented-in-term-of,而复合(composition)也有通用的功效,那么两者直接如何取舍呢?答案很简单:尽可能使用复合,必要时才使用private继承。何时才是必要的呢?主要是当protected成员或virtual函数牵扯进来的时候(因为这个时候可以重新对base类的一些函数重新定义)。


给个例子

class Widget: private Timer{
private:
    virtual void onTick() const; //查看Widget数据
    ...
};

Widget想要重新定义Timer内的虚函数onTick(),故必须继承自Timer。但pubic继承不合适,因为Widget不是一个Timer。藉由private继承,将onTick变成private,而我们重新声明(定义)时仍然把它留着那儿。


这是一个好设计,但是private继承并非绝对必要。我们可以用复合取而代之

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值