我在理解OOP的某些概念时遇到了一些问题。可以说存在不同的形状(圆形,正方形等),但是它们都是形状。因此,我可以使用多态来在矢量中存储/收集所有形状,例如:
Shape* circle = new Circle(); // inherits form Shape-class
Shape* box = new Box(); // inherits form Shape-class
vector<Shape*> list;
list.push_back(circle);
list.push_back(box);
但是,如果我想访问Shape
或Box
类(从Circle
类派生)类的特定属性或方法,该怎么办? list
-向量,通过多态将它们存储为Shape
-对象?
基本上,我想这样做(但这是不可能的):
double radius = list[0]->get_radius();
谢谢。
答案 0 :(得分:1)
您尚未指定语言,但是您的代码看起来是C ++,所以我假设是这样。
首先,您需要考虑设计。您正在将一些形状(不一定是所有圆形)放入集合中,但随后尝试调用仅对圆形有效的方法。当您尝试去广场时会发生什么?如果这些对象全部都是圆形,则应考虑将其放入仅包含圆形的容器中,可以将正方形放入另一个容器中。
但是,如果您想要的是:
iterate over the objects
if the object is a circle, then call get_radius,
if the object is not a circle, move on or do something else
然后,只要基类至少具有一个虚函数,就可以使用dynamic_cast来实现。
Shape* shapePointer = list[0]; // get a shape from the collection some way, maybe by iterator instead
Circle* circlePointer = dynamic_cast<Circle*>(shapePointer);
if(circlePointer != nullptr)
{
circlePointer->get_radius(); // obviously you'd want to do something with the result here
}
无法从基类中“访问派生类的方法”-由于它不具有有关派生类的信息,因此我们在这里测试基指针是否实际上指向特定对象派生类,如果是这样,我们将其用作派生类。
需要注意转换,但是在上面的代码中,我们检查了转换是否成功,并且有可接受的方式继续进行转换。
另一种方法是考虑为基类提供虚拟的get_perimeter方法,该方法可以以特定于形状的方式为所有派生类实现。