假設我有一個類形狀和2個派生類,它們是圓形和方形的。該代碼是:C++將指針從一個派生類轉換爲另一個
Shape* s1 = new circle;
現在我想asssigne S1方,同時保留兩者共同的變量。
Shape* s1 = new Square;
我該怎麼做?
假設我有一個類形狀和2個派生類,它們是圓形和方形的。該代碼是:C++將指針從一個派生類轉換爲另一個
Shape* s1 = new circle;
現在我想asssigne S1方,同時保留兩者共同的變量。
Shape* s1 = new Square;
我該怎麼做?
您可以使用拷貝構造函數:
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/
通過使用一個構造函數的基類的引用,你可以很容易地複製共同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());
}
你是什麼意思「保留變量」? –
我認爲他的意思是「成員」。沒有使用轉換功能是不可能的。你爲什麼要把一個圓轉換成一個方形? –
你**不要**那樣做。 「如何」是無關緊要的。 –