Imb*_*bue 6 c++ inheritance reference
我试图在C++中找到一个很好的继承解决方案.
我有一个Rectangle类和一个Square类.Square类不能公开继承Rectangle,因为它不能完全满足矩形的要求.例如,一个Rectangle可以分别设置它的宽度和高度,当然这对于Square来说是不可能的.
所以,我的困境.Square显然会与Rectangle共享很多代码; 它们非常相似.
对于examlpe,如果我有这样的功能:
bool IsPointInRectangle(const Rectangle& rect);
Run Code Online (Sandbox Code Playgroud)
它应该适用于广场.事实上,我有很多这样的功能.
所以在制作我的Square类时,我想我会使用一个可公开访问的Rectangle转换运算符的私有继承.所以我的方形类看起来像:
class Square : private Rectangle
{
public:
operator const Rectangle&() const;
};
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将Square传递给IsPointInRectangle函数时,我的编译器只是在该上下文中抱怨"Rectangle是一个不可访问的基础".我希望它能够注意到Rectangle运算符并使用它.
我正在努力做甚么可能吗?
如果这不起作用,我可能会将 Rectangle的一部分重构为MutableRectangle类.
谢谢.
你可以创建一个类ImmutableRectangle,没有任何mutator和只有const方法,你可以从中正确地得到它们Rectangle,ImmutableSquare并且,从那里,和Square.请注意,在可变性方面,IS-A关系确实存在 - 一个不可变的方形IS-A不可变矩形:可变性是唯一严重的问题,因此通过将其分解出来,您可以获得一些实质性的代码重用(适用于所有const用途 -事实上,使用或需要可变性.
只要没有(不可变)基类的类不变量实际上依赖于不变性特征,就可以在继承中引入可变性.当然,不可变对象可以从const指针或对可变版本的引用中正确构造(可能在单独的内联友元函数中,以避免给基类提供对派生类的依赖;-)以便合理地使用.
编辑:一个评论表示理解的疑虑,因为"一个mutabe不是一成不变":来思考这一点,你需要了解什么是"IS-A" 是指 ......,它并不能意味着Korzybski -denied" is身份":它意味着LSP.经历约束的严格意义,这意味着:协方差,逆变,弱相等的前提条件,更强的平等后置条件等,因为它们适用于基类(不可变)和派生(可变)类的const方法.您将看到类不变量是唯一的问题,正如我在上一段中所提到的那样,所以只是避免将不变性断言为类不变量并且您在三叶草中;-).
也许这将有助于命名基类NotNecessarilyMutableRectangle,因为它不能断言不可改变的一类不变; 非常精确的命名可能在哲学上令人放心,但在日常编码中可能有点不方便.
嗯,我很惊讶。看来私有继承类 A 会阻止您在类之外使用运算符 A。
您可以通过为正方形创建一个成员 Rectangle 并将其用于强制转换来解决您的问题:
class Square {
Rectangle r;
public:
operator const Rectangle&() const {
return r;
}
};
Run Code Online (Sandbox Code Playgroud)
这应该可以编译并工作。我相信,如果有的话,它也不会给你带来那么多工作要做。