簡體   English   中英

如何從虛函數返回泛型派生類?

[英]How to return a generic derived class from a virtual function?

我正在編寫一個創建和操作形狀的程序。 我遇到問題的代碼部分如下,特別是多邊形類中虛函數的返回類型。 (這已經減少了緊湊性)

    class polygon{
    public:
    virtual ~polygon(){};
    virtual class polygon translate() {};
    };

    class Itriangle : public matrix, polygon{  
   private:
      vector <matrix> vertices;  // vector of matrices 
      double centrex;
      double centrey;
      double sides;
   public:
   //Constructors (default/p const(points)/p const(centre and lengths))
   Itriangle(){};

   //Destructor
   ~Itriangle(){};

   //Functions from interface

   Itriangle translate(class matrix &m){
      . . .
   Itriangle translated (transCx, transCy, a, b, c);
       return translated ;
   } 

然后我繼續從多邊形類派生其他幾個形狀。

我遇到的問題是我希望translate函數能夠返回從polygon派生的任何類。

我試圖使用點和模板,但我不確定兩者。

任何幫助都會很棒。

你指的是一種叫做協變回歸類型的概念。

由於函數的返回類型不是其簽名的一部分,因此只要是指針引用,就可以在多態方法中返回基類返回類型的派生類型。

在你的情況下,Itriangle的指針(或引用)。

class polygon {
public:
    polygon *translate(class matrix &m) {
       return new polygon(...);
    }
};

class Itriangle : public matrix, polygon {
public:
    Itriangle *translate(class matrix &m) {
       return new Itriangle(...);
    }
};

請注意,如果要將其返回,則無法在translate方法的堆棧中創建它。 意思是,你必須使用new來分配它。

一般來說,也可以通過引用來實現這一點,但在你的情況下,因為ITriange是在translate(...)方法中創建的,所以它會有問題(無論是在堆棧上創建還是引用都指向未分配的內存,或者它在堆上分配,沒有人知道它需要被刪除,因為它是一個參考)。
例如,如果您要返回該類的成員,那么您將能夠使用引用。


我已經創建了一個虛擬應用程序供您查看它的實際應用:

#include <iostream>

using namespace std;

class polygon {
public:
    virtual polygon *translate(int x) {
        cout << "polygon!" << endl;
       return new polygon();
    }
};

class Itriangle : public polygon {
public:
    Itriangle *translate(int x) {
        cout << "triangle!" << endl;
       return new Itriangle();
    }
};

int main() {
    polygon p;
    Itriangle t;
    polygon &pt = t;

    p.translate(1);
    t.translate(2);
    pt.translate(3);
}

這打印:

多邊形!
三角形!
三角形!


順便說一句,我注意到你的代碼中有錯誤

你的Itriangle定義如下:

class Itriangle : public matrix, polygon {
    ...
};

這意味着你私下繼承多邊形。 這很少是你想做的事情。
我在猜你:

class Itriangle : public matrix, public polygon {
    ...
};

暫無
暫無

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

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