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

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

Stack Overflow用户
提问于 2020-05-23 15: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 17:18:09

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

代码语言:javascript
代码运行次数:0
运行
复制
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
运行
复制
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
运行
复制
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
运行
复制
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
运行
复制
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

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档