首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何理解“C++中的继承是为了表达接口遵从性,而不是为了获得代码重用”?有谁能通过一些简单的例子来说明这一点吗?

如何理解“C++中的继承是为了表达接口遵从性,而不是为了获得代码重用”?有谁能通过一些简单的例子来说明这一点吗?
EN

Stack Overflow用户
提问于 2020-05-23 07:53:45
回答 1查看 64关注 0票数 0

根据文档(https://isocpp.org/wiki/faq/objective-c#objective-c-and-inherit),它说:

在C++中继承的目的是表达接口遵从性(子类型),而不是获得代码重用。在C++中,代码重用通常是通过组合而不是通过继承实现的。换句话说,继承主要是一种规范技术,而不是一种实现技术。

如何理解它?有人能用一些简单的例子说明这一点吗?

EN

回答 1

Stack Overflow用户

发布于 2020-05-23 09:18:09

假设您有一个名为store_an_int的类(诚然很愚蠢)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class store_an_int {
public:
    store_an_int(int x) : val(x) {}
    void set_my_value(int x) { val = x; }
    int get_my_value() const { return val; }
private:
    int val;
};

现在您可以存储和检索一个整数值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
store_an_int value(3);
std::cout << value.get_my_value(); // displays "3"
value.set_my_value(4);
std::cout << value.get_my_value(); // displays "4"

现在,您有了一个类,它需要存储一个int并对其做一些工作。你可以这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class doubler : public store_an_int {
public:
    doubler(int x) : store_an_int(x) {}
    int get_my_value() const { return store_an_int::get_my_value() * 2; }
};

现在可以存储整数值并检索其加倍值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
doubler value(3);
std::cout << value.get_my_value(); // displays "6"
value.set_my_value(4);
std::cout << value.get_my_value(); // displays "8"

这是代码重用。是的,doubler存储一个int值,但这是它所做的事情的附带,而且使用继承是误导的。doubler有两个成员函数,它们的名称与store_an_int中的成员函数相同。但是,如果有人向store_an_int添加了一个成员函数,比方说,void store_an_int::show() const { std::cout << val << '\n'; },您想要发生什么?现在,doubler有了一个新的成员函数show(),它显示了错误的值。是的,您可以重写doubler以存储加倍值,而不是原始值,这将使store_an_int::show()显示正确的值。但是如果你不想要那个功能,你仍然会被它困住。

相反,代码应该使用组合:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class doubler {
public:
    doubler(int x) : value(x) {}
    int get_my_value() const { return value.get_my_value() * 2; }
    void store_my_value(int x) { value.store_my_value(x); }
private:
    store_my_value value;
};

现在,如果store_an_int添加了一个成员函数,它就不会成为doubler接口的一部分,您可以简单地忽略它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61974704

复制
相关文章
友情链接:先友情后链接,不是为了链接而链接
我相信大多数博客圈的博主们都会在自己的博客中开设“友情链接”栏目,与别人交换网站链接,目的是什么?可能有的人说,为了SEO,为了蹭流量,为了蹭权重……但是我认为,这些目的远远背离了“友情链接”中的“友情”二字。
a老胡
2018/12/26
1.5K0
简单理解通过原型继承
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> </body> </html> <script> window.onload=function(){ //这里有三个对象,a,b,c; function A(){ //给a中添加属性与方法; this.name="我的对象A"; this.mothed=function(){ console.log("我是对象a中方
前朝楚水
2018/04/02
5500
写文章真的是为了报酬吗?
其实我也就是微微一笑,因为写文章去得到报酬从一开始并不是我的目标,也没有想打算通过文章的赞赏来解决生活问题。
恒宇少年
2018/10/10
6360
写文章真的是为了报酬吗?
只是为了少写代码?增强赋值没有那么简单!
相信但凡是写过 Python 的都用过,格式大多都只是简写,这种形式的被称为增强赋值语句,这是 Python 从 C 语言抄,阿不,借鉴过来的...
编程文青李狗蛋
2019/11/20
3950
只是为了少写代码?增强赋值没有那么简单!
To 机器人:我们煞费苦心,还不是为了让你有尊严的学习!
企鹅号小编
2018/01/02
6750
To 机器人:我们煞费苦心,还不是为了让你有尊严的学习!
非常好的理解遗传算法的例子有哪些_知觉理解性的例子
为更好地理解遗传算法的运算过程,下面用手工计算来简单地模拟遗传算法的各 个主要执行步骤。 例:求下述二元函数的最大值:
全栈程序员站长
2022/09/30
3660
非常好的理解遗传算法的例子有哪些_知觉理解性的例子
Java中为什么要使用单继承而不是多继承?
(1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量。
Vincent-yuan
2021/10/13
1.8K0
手写RPC框架,真不是为了装13!
你可能没有被问到过,可能是运气好,也可能是你还没到这个级别。通常月薪20k以上,基本上都会问一些设计性的题目。
田维常
2022/11/25
7420
手写RPC框架,真不是为了装13!
休息,是为了更好的前行。
作为一名学生,还是要以学为本,近期各种还没做的,还没做完的事情很多,其实在过年后开学也提到过: 暂时是没时间更新了,最少一个月,最迟暑假会恢复更新,当然,也不能说停就停,我知道你们盯着我的网盘很久了
课代表
2018/06/29
8790
如果不是为了生活,你还会选择编程么?
字字扎心的一句话,如果重新来过还会做出当初的选择嘛?曾经和一些资深级别的程序员聊天提到这个话题,如果回到当初还会选择继续程序员的生涯,不仅仅是兴趣和生活,对于自己这种性格内向又不善于表达,估计只能是与
程序员互动联盟
2018/03/12
5600
如果不是为了生活,你还会选择编程么?
Javascript中this的一些简单理解
this是JavaScript中的一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。this实际是在函数被调用时才发生的绑定,也就是说this具体指向什么,取决于你是怎么调用的函数。
henu_Newxc03
2021/12/28
2850
谈谈面向对象编程
最近写了些和函数式编程的文章,有读者和我讨论函数式编程和面向对象编程的优劣。二者都是很好的编程思想,都在着力解决代码重用的问题,也彼此吸收对方的优点,所以大可不必去分个高下。然而, 我面试过许多号称精通面向对象编程(比如:Python / Ruby / C++)的工程师,随便问几个问题,就可以看出这个人对面向对象的理解: 你觉得在面向对象编程中,最重要的思想是什么? 如果有人提及「继承」,我会让她写个她在工作中使用继承的例子。 如果有人提及「多态」,我会让她解释一下多态,并让她写个她在工作中使用多态的例子。
tyrchen
2018/03/28
9130
谈谈面向对象编程
进军CRM,SAP真的只是为了干掉Salesforce吗?
企业服务巨头SAP似乎决心要在2018年掀起一番波澜,特别是在CRM中。如今年刚开年,SAP就宣布将斥资约24亿美元收购云端销售绩效管理公司CallidusCloud。而之后在今年Q1财报的电话会议上,SAP CEO 孟鼎铭(Bill McDermott)多次强调:“我们想要CRM”,并提到公司将在6月举行的SAPPHIRE NOW 用户大会上发布全新的平台CRM产品。最终,孟鼎铭没有食言,SAP为我们带来了全新的CRM 套件C/4 HANA。据SAP方所言,这个全新的CRM套件可以颠覆包括Salesforce 产品在内的所有已存在的CRM服务。
人称T客
2018/07/30
6500
Java中接口简单说明
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。
用户9006224
2022/12/21
1750
Java中接口简单说明
Java编程思想第五版(On Java8)(一)-什么是对象
计算机革命起源机器。编程语言就像是那台机器。它不仅是我们思维放大的工具与另一种表达媒介,更像是我们思想的一部分。语言的灵感来自其他形式的表达,如写作,绘画,雕塑,动画和电影制作。编程语言就是创建应用程序的思想结构。
JavaEdge
2020/05/27
7740
Java编程思想第五版(On Java8)(一)-什么是对象
伙计们,Go 并没有那么简单
出于好奇,我最近开始接触一些 Go 的代码。我之前对它有一些了解,但是从来没有尝试去写(没有需求)。但是现在我们团队选择使用 Go 来开发一个项目,所以我觉得这是一个获得实际经验的好机会。 到目前为止,关于这门语言我已经学习了很长时间。在这个博文的末尾,我会写更多关于 Go 的干货。 社区实际上并不那么令人愉快,特别是那些因为它的简单性而主张使用 Go 的人。似乎简单已经成为 Go 社区中的一个流行语,许多人反复重复提到这点,却没有给出太多实际的想法。 这对我来说似乎很不幸,因为在我看来,Go 是一个“极其
李海彬
2018/03/19
8030
2023 年 30 个 OOP 面试问题和答案
面向对象编程(OOPs)是一种在程序中实现对象概念的编程范式。它旨在通过在编程中实现继承、抽象、多态等现实世界中的实体,为现实世界中的问题提供更简便的解决方案。OOPs概念被广泛应用于Java、Python、C++等多种流行语言中。
用户1418987
2023/10/16
3470
2023 年 30 个 OOP 面试问题和答案
今年的面试太难了?2023 年 30 个 OOP 面试问题和答案也许可以帮到你
面向对象编程(OOPs)是一种在程序中实现**对象概念的编程范式。它旨在通过在编程中实现继承、抽象、多态等现实世界中的实体,为现实世界中的问题提供更简便的解决方案。OOPs概念被广泛应用于Java、Python、C++等多种流行语言中。
用户1418987
2023/10/16
6300
今年的面试太难了?2023 年 30 个 OOP 面试问题和答案也许可以帮到你
浅论C++的复杂性
C++语言已经有了30多年的历史。作为一门影响广泛的编程语言,它所受到的关注和争论恐怕是任何一门其他的语言所不能比拟的。十几年前,Java等新生语言的出现曾导致“C++信任危机”,但最终C++以自身非凡的品质屹立于主流编程语言的行列。在有着众多编程语言可以选择的今天,到底还有没有必要学习C++?怎样学习C++?怎样使用C++?对于广大的程序员,特别是对于刚刚接触编程的学习者,这些问题都是至关重要的。
恋喵大鲤鱼
2018/08/03
1.1K0
点击加载更多

相似问题

这是为了发展而不是为了生产吗?

20

不是为了理解Scala而工作

12

意图不是为了获得高分而工作

10

如果不是为了可重用性,那么制作用户控件是“错误的”吗?

30

vs2013编译是为了调试,而不是为了发布?

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文