簡體   English   中英

在C ++中實現接口

[英]Implementation of interface in C++

我在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 ++標准是否支持此功能? 謝謝。

與層次的問題是,你的Rectangle現在繼承了IBase兩次:一次通過IShape ,一旦通過BaseImplementation 名為Virtual Inheritance的 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(),因為它是繼承的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM