随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万

【34】区分接口继承和实现继承

1、接口继承和实现继承表示的意义

  接口继承:父类提供的接口,子类仍然提供。

  实现继承:子类复用父类的代码实现。

2、子类继承父类,可分为下列情况:

  a、继承接口,继承实现---对应non-virtual方法。

  b、继承接口,继承缺省实现,允许子类修改实现---对应virtual方法。

  c、只继承接口---对应pure virtual方法,父类只提供接口,强制子类提供实现。

  b、关闭接口,继承实现:private继承,表示根据某物实现出,子类关闭接口。

3、现在,考虑下面的场景:父类有个virtual方法XXX(),目的是让子类继承缺省实现,允许子类修改。现在有个子类,应该重写XXX,但是程序员忘了,会出现什么结果?

  编译不会出错,运行时调用父类的缺省实现。这有可能会导致大灾难。有没有办法预防呢? 这个问题的关键是,接口和缺省实现在一起。解决办法是:父类使用pure virtual方法,强制要求子类提供实现,如果子类不提供,编译通不过。同时,父类定义一个non-virtual方法,提供缺省实现。子类重写pure virtual方法时,可以转交父类提供的缺省实现。

  这样解决的缺点是:多声明了一个缺省实现的方法。有没有更好的办法呢?

  在C++,对于pure virtual方法可以提供实现。因此,可以在父类中,定义pure virtual方法,子类重写pure virtual,转交父类的pure virtual实现。

4、使用pure virtual 方法代替virtual方法的目的是:为了防止子类忘记重写,分离接口和实现,强制子类重写。其实,这个理由并不好,因为有时候,子类确实想继承缺省实现,使用了pure virtual,必须重写,在方法内转交缺省实现。

5、另外,使用pure virtual方法,会使父类成为抽象类,不能实例化。

posted on   Andy Niu  阅读(453)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2012-12-31 依赖,关联,聚合,合成
2011-12-31 C# 异常处理
2011-12-31 局部变量与全局变量
2011-12-31 删除集合中满足条件的元素
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示