根据文档(https:/isocpp.orgwikifaqobjective-c#objective-cand-inherit。),其中说到。
在C++中,继承的目的是为了表达接口的合规性(子类型化),而不是为了获得代码重用。在C++中,代码重用通常是通过组成而不是通过继承来实现的。换句话说,继承主要是一种规范技术而不是实现技术。
如何理解呢?谁能用一些简单的例子来说明一下?
假设你有一个(诚然很傻)的类,名为 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
,你可以直接忽略它。