接口在C++中的实现

Implementation of interface in C++

本文关键字:实现 C++ 接口      更新时间:2023-10-16

我在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)};
};

是否可以从BaseImplementation将方法Dimensions()的实现插入到类Rhombus中?某些版本的C++标准是否支持此功能?Thx。

层次结构的问题是,Rectangle现在继承IBase两次:一次通过IShape,一次通过BaseImplementation。名为"虚拟继承"的C++特性是为处理类似情况而设计的。请注意,您还需要使IShape的继承IBase成为virtual public

如果Dimensions()是在BaseImplementation中实现的,并且访问权限至少为protected,则任何派生对象都应该可以看到它。

因此,如果Rhombus是从BaseImplementation派生的,那么它将能够使用Dimension()函数。如果您想在Rhombus的情况下实现Dimension(),那么您的Dimension()应该是virtual,并且您应该在Rhombus 中覆盖它

您可以简单地在二者之间实现一个定义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); }
...
    };

不需要显式插入实现。你已经可以打电话了myRhombus->Dimension(),因为它是继承的。