在C ++中实现接口

时间:2012-01-27 11:07:22

标签: c++ inheritance multiple-inheritance partial-classes

我在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。

4 个答案:

答案 0 :(得分:3)

您的层次结构存在的问题是,您的Rectangle现在继承IBase两次:一次通过IShape,一次通过BaseImplementation。名为Virtual Inheritance的C ++功能旨在处理类似的情况。请注意,您还需要IShape继承IBase virtual public

答案 1 :(得分:1)

如果在Dimensions()中实施了BaseImplementation,并且访问权限至少为protected,那么任何派生对象都应该可以看到Rhombus

如果Dimension()来自BaseImplementationDimension()将能够使用Rhombus函数。如果您希望在Dimension()的情况下拥有virtual的具体实施,那么您的Rhombus应为{{1}},并且您应该在{{1}}中覆盖它

答案 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()因为它是继承的。