我在C ++中对继承的帮助很小。我的代码具有相同的结构:
class IBase {
public:
virtual long Dimensions() = 0;
};
class IShape : public IBase {
virtual long Area() = 0;
};
class Rectangle : public IShape {
private:
long x;
public:
long Dimensions() {return x};
long Area() {return x*x};
};
class Rhombus: public IShape {
private:
long x;
long fi;
public:
long Dimensions() {return x};
long Area() {return x*x*sin(fi)};
};
如您所见,Dimensions()的实现对于两个类都是相同的。现在我不想做这样的事情:
class BaseImplementation : public IBase {
protected:
long x;
public:
virtual long Dimensions() {return x};
};
class Rectangle : public IShape, public BaseImplementation {
public:
long Area() {return x*x};
};
class Rhombus: public IShape, public BaseImplementation {
private:
long fi;
public:
long Area() {return x*x*sin(fi)};
};
是否可以将方法Dimensions()的实现从BaseImplementation插入到Rhombus类中?某些版本的C ++标准是否支持此功能? THX。
答案 0 :(得分:3)
您的层次结构存在的问题是,您的Rectangle
现在继承IBase
两次:一次通过IShape
,一次通过BaseImplementation
。名为Virtual Inheritance的C ++功能旨在处理类似的情况。请注意,您还需要IShape
继承IBase
virtual public
。
答案 1 :(得分:1)
如果在Dimensions()
中实施了BaseImplementation
,并且访问权限至少为protected
,那么任何派生对象都应该可以看到Rhombus
。
如果Dimension()
来自BaseImplementation
,Dimension()
将能够使用Rhombus
函数。如果您希望在Dimension()
的情况下拥有virtual
的具体实施,那么您的Rhombus
应为{{1}},并且您应该在{{1}}中覆盖它1} p>
答案 2 :(得分:1)
您可以简单地在两者之间实现一个定义Dimension的图层:
class IBase {
public:
virtual long Dimensions() = 0;
};
class IShape : public IBase {
public:
virtual long Area() = 0;
};
class IShapesDefinedDimension : public IShape
{
public:
long Dimensions() { return x; }
protected:
long x;
};
class Rectangle : public IShapesDefinedDimension {
public:
long Area() {return x*x;}
};
class Rhombus: public IShapesDefinedDimension {
public:
long Area() {return x*x*sin(fi); }
...
};
答案 3 :(得分:0)
无需显式插入实现。你已经可以打电话了 myRhombus-> Dimension()因为它是继承的。