2013-06-30 5 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) 
    { 
     ... 
    } 

    ... 
}; 

Не забывайте, что преобразование круга на площади немного странно.

И в вашей реализации есть memory LEAK. Если вы не хотите использовать вас Circle, удалите его.

Это было бы лучше:

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

delete s1; 

EDIT: Вот ссылка про конструктор копирования и присваивания оператора: 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()); 
}