根据文档(https://isocpp.org/wiki/faq/objective-c#objective-c-and-inherit),它说:
在C++中继承的目的是表达接口遵从性(子类型),而不是获得代码重用。在C++中,代码重用通常是通过组合而不是通过继承实现的。换句话说,继承主要是一种规范技术,而不是一种实现技术。
如何理解它?有人能用一些简单的例子说明这一点吗?
发布于 2020-05-23 09:18:09
假设您有一个名为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
接口的一部分,您可以简单地忽略它。
https://stackoverflow.com/questions/61974704
复制相似问题