我在访问对象时遇到问题,该对象是类的变量。继承和关系如下所示:
#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();
};
最佳选择取决于您的确切要求。