c++ - 多态性 - 如何访问派生类的方法?

标签 c++ polymorphism

我在理解 OOP 的某些概念时遇到一些问题。假设存在不同的形状(圆形、正方形等),但它们都是形状。因此我可以使用多态性来存储/收集 vector 中的所有形状,例如:

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 派生的)类 BoxCircle 的特定属性或方法怎么办? ,如果我只能通过 list-vector 访问这些对象,它们通过多态性存储为 Shape-objects?

基本上,我想这样做(但这是不可能的):

double radius = list[0]->get_radius();

谢谢。

最佳答案

你没有指定语言,但你的代码看起来是 C++,所以我假设是这样。

首先你需要考虑设计。您正在将一些形状(不一定是所有圆圈)放入集合中,但随后尝试调用仅对圆圈有效的方法。当你试图到达一个广场时应该发生什么?如果这些对象都需要是圆,你应该考虑把它们放在一个只包含圆的容器中,你可以把你的方 block 放在另一个容器中。

如果你想要的是:

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 方法,该方法可以以适当的特定于形状的方式为所有派生类实现。

关于c++ - 多态性 - 如何访问派生类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51868354/

相关文章:

c++ - 将数组数据写入opencv中的文本文件

c++ - 如何实现纯虚函数

c++ - 多态枚举

c++ - 将 std::wstring 从 Visual Studio 移植到 mingw gcc

c++ - 为什么 boost 寻找 libboost_*.lib 而不是 boost_*.lib?

c++ - 在哪里可以找到免费或开源的 C++ 库来进行 BCD 数学运算?

c++ - Aligned_alloc 行为

javascript - TypeORM多态关系无法从父级获取数据

oop - 多态性与继承作为 oop 的支柱

c++ - 多态类中的虚析构函数