我在访问对象时遇到问题,该对象是类的变量。继承和关系如下所示:

#include "X.h"

class Y
{
    X object;

public:
    X & getObject();
};


然后是另一个文件/类:

#include "Y.h"

class Z : public Y
{
    X object2;
public:
    X & getObject2();
};


最后是一个获得指向对象的指针的向量的类。

 #include "Z.h"

 class XYZ
 {
    vector<Y*> cont;  //contains objects of class type Z and Y
 };


如果我想访问object变量,我只需写

cont[index]->getObject();


但是无法访问object2,编译器甚至看不到getObject2()这样的方法。我想我的描述不清楚,但是无论如何我希望您能帮助我。

最佳答案

您的第一个问题是确定是否可以调用getObject2方法。您的代码中的注释说向量包含两种对象,那么如何确定某个特定对象是Z而不是Y?如果它是Y,则getObject2方法不可用,并且您不得尝试调用它。

您有几种选择。这里是其中的一些:


一种解决方案是对两种不同的类型使用两个单独的向量:

vector<Y*> conty;
vector<Z*> contz;


但是,这不会保持不同对象类型之间的顺序。这是否有问题取决于您的目的。
另一个解决方案是将指针转换为所需的类型-

(Z *)(cont[index])->getObject2();


...但是,只有在知道指向对象的实际类型的情况下,才能执行此操作。如果不确定,可以使用dynamic_cast

Z *z = dynamic_cast<Z *>(cont[index]);
if (z != nullptr) {
    z.getObject2();
}

另一种解决方案是将getObject2添加到基类Y中,并将其虚拟化,以便可以在Z中覆盖它。您可以在Y中实现,只需返回nullptr。您将需要更改getObject2的返回类型,以便它返回指针而不是引用。

class Y
{
    X object;

public:
    X & getObject();
    virtual X * getObject2();
};



最佳选择取决于您的确切要求。

09-09 18:33