У меня есть простой пример Shape
, где я могу создать Circle
s или Square
s.Доступ к членам производного класса из созданного на заводе экземпляра
я добавил дополнительный «contents
» атрибут к Circle
класса, который не является частью производного класса Square
или Shape
базового класса.
Проблема заключается в том, что при создании экземпляра класса Circle
с использованием моей фабрики я не могу изменить contents
созданного объекта.
#include <iostream>
using namespace std;
// Shape base clas
class Shape {
public:
// Shape constructor;
Shape() {
id_ = total_++;
}
// Virtual draw method
virtual void draw() = 0;
protected:
int id_;
static int total_;
};
int Shape::total_ = 0;
// Circle derived class
class Circle : public Shape {
public:
void draw() {
contents = 0;
cout << "circle " << id_ << ": draw, contents: " << contents << endl;
}
// Attribute to attempt to access
int contents;
};
// Square derived class
class Square : public Shape {
public:
void draw() {
cout << "square " << id_ << ": draw" << endl;
}
};
// Factory class
class Factory {
public:
Shape* createCurvedInstance() {
return new Circle;
}
Shape* createStraightInstance() {
return new Square;
}
};
// Main
int main()
{
Factory* factory = new Factory;
Shape* thing = factory->createCurvedInstance();
// Draw method works fine (as it should)
thing->draw();
// Fails: "expression must have class type"
thing.contents = 4;
system("pause");
return 0;
}
Как я могу получить доступ к атрибутам производного класса, когда я создаю экземпляр этого, используя завод?
Вы этого не думали. Вы возвращаете статический тип 'Shape *', и весь компилятор знает во время компиляции 'Shape *' stuff. Поскольку 'contents' не является частью' Shape', вы получаете ошибку. Кроме того, ваш объект 'Shape' должен иметь виртуальный деструктор, учитывая, как вы собираетесь его использовать. – PaulMcKenzie