gpt4 book ai didi

c++ - 公开添加但继承私有(private)

转载 作者:行者123 更新时间:2023-11-30 01:00:57 24 4
gpt4 key购买 nike

我想通过避免公共(public)继承将一个类直接添加到一个新类中。例如我有一个类

class size {
private:
int width;
int height;
public:
void set_width(int w) { width = w; }
int get_width() { return width; }
void set_height(int h) { height = h; }
int get_height() { return height; }
int get_area() { return width*height; }
};

并且只是想将它的功能插入到像这样的新类中

class square : public size { 
// ...
};

会写

square s;
s.set_width(10);
s.set_height(20);
cout << "Area of the square: " << s.get_area() << endl;

但这样我就违反了公共(public)继承的 is-a 规则。我的square不是 size有一个 size .所以我必须写

class square {
public:
size its_size;
// ...
};

但现在我最初的想法是插入 size 的功能右转square迷路。我必须写

square s;
s.its_size.set_width(10);
s.its_size.set_height(20);
cout << "Area of the square: " << s.its_size.get_area() << endl;

或者为 size 的 getter 和 setter 添加几个包装器进入square .

编辑:我必须添加:size注定没有虚拟析构函数。我不想使用 size并且它是多态的后代。

编辑 2: 另一个例子:您想编写一个提供与 std::list<T> 相同接口(interface)的类但提供的功能比简单的独立功能可以完成的要多得多。标准容器不应被子类化,因此您必须添加 std::list<T>作为成员并包装所有公开提供的功能 std::list<T>直接到你的新类(class)。这是大量重复性工作并且容易出错。

问题: 是否可以添加size的接口(interface)?公开进入 square没有公开继承 size .我的square不应该是 size但应该提供相同的界面(在它自己的部分旁边)。

最佳答案

为什么您的界面大小?为什么不把它做成 shapeboundedarea 或类似的东西,它们同样描述了界面,而且对于其中任何一个,正方形肯定是 (形状/边界区域)?

关于c++ - 公开添加但继承私有(private),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1687313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com