2013-06-30 174 views
0

假設我有一個類形狀和2個派生類,它們是圓形和方形的。該代碼是:C++將指針從一個派生類轉換爲另一個

Shape* s1 = new circle; 

現在我想asssigne S1方,同時保留兩者共同的變量。

Shape* s1 = new Square; 

我該怎麼做?

+1

你是什麼意思「保留變量」? –

+1

我認爲他的意思是「成員」。沒有使用轉換功能是不可能的。你爲什麼要把一個圓轉換成一個方形? –

+1

你**不要**那樣做。 「如何」是無關緊要的。 –

回答

1

您可以使用拷貝構造函數:

Shape* s1 = new Circle; 
Shape* s1 = new Square(s1); 

有了:

class Square : public Shape 
{ 
    ... 
public: 
    Square(const Circle& rhs) 
    { 
     // Copy the value you want to keep 
     // Respect the rules of copy constructor implementation 
    } 
    // Even better : 
    Square(const Shape& rhs) 
    { 
     ... 
    } 

    ... 
}; 

不要忘了,轉換成圓形廣場是有點怪。

而且還有一個內存泄漏在您的實現。如果您不想使用Circle,請將其刪除。

這會更好:

Shape* s1 = new Circle; 
Shape* s2 = new Square(s1); 

delete s1; 

編輯:這是一個關於拷貝構造函數和assignement運營商鏈接:http://www.cplusplus.com/articles/y8hv0pDG/

2

通過使用一個構造函數的基類的引用,你可以很容易地複製共同Shape數據:

#include <assert.h> 

enum class Color { red, green, blue }; 

class Shape { 
    public: 
    Shape() : color(red) { } 
    void setColor(Color new_color) { color = new_color; } 
    Color getColor() const { return color; } 
    private: 
    Color color; 
}; 

class Square : public Shape { 
    public: 
    Square() { } 
    // Using explicit constructor to help avoid accidentally 
    // using the wrong type of shape. 
    explicit Square(const Shape &that) : Shape(that) { } 
}; 

class Circle : public Shape { 
    public: 
    Circle() { } 
    explicit Circle(const Shape &that) : Shape(that) { } 
}; 

int main(int,char**) 
{ 
    Circle circle; 
    circle.setColor(Color::blue); 
    Square square(circle); 
    assert(circle.getColor()==square.getColor()); 
} 
相關問題