如何理解 "C++中的继承是为了表达接口的合规性,而不是为了获得代码的重用",谁能通过一些简单的例子说清楚?

问题描述 投票:0回答:1

根据文档(https:/isocpp.orgwikifaqobjective-c#objective-cand-inherit。),其中说到。

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

如何理解呢?谁能用一些简单的例子来说明一下?

c++ inheritance interface
1个回答
3
投票

假设你有一个(诚然很傻)的类,名为 store_an_int:

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;
};

现在你可以存储和检索一个整数值。

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并对其进行一些操作。你可以把它写成这样。

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; }
};

现在你可以存储一个整数值 并检索它的双倍值。

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() 显示正确的值。但如果你不想要这个函数,你还是会被它困住。

相反,代码应该使用组成。

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,你可以直接忽略它。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.