我遇到了访问对象的问题,该对象是类的变量。继承和关系如下:
#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()
这样的方法。我认为我的描述并不清楚,但无论如何我希望你会帮助我。
答案 0 :(得分:1)
您的第一个问题是确定是否可以调用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();
};
哪种选择最好取决于您的具体要求。
答案 1 :(得分:1)
您似乎需要虚拟功能。您的代码可能会以这样的方式更改:
#include "X.h"
class Y
{
X object;
public:
virtual X & getObject()
{
return object;
}
};
和
#include "Y.h"
class Z : public Y
{
X object2;
public:
virtual X & getObject()
{
return object2;
}
};
所以在任何
的召唤下cont[index]->getObject();
在运行时,查看某个实体的虚拟表,指向cont [index]的指针。如果它是指向Y对象的指针,则调用Y类的getObject(),如果它是指向Z对象的指针,则调用Z类的getObject()。
答案 2 :(得分:0)
如果您想要尝试 来呼叫object2()
,您可以尝试使用dynamic_cast
来输入Z*
。在documentation中,您有关于如何使用它的完整说明(例如:如果您将指针传递给Y类型的对象,它将无法返回NULL指针)
Z* p_z = dinamic_cast<Z*> (cont[index])
if (p_z)
std::cout << p_z->getObject2();
答案 3 :(得分:0)
cont
是Y*
的向量。这意味着其成员仅公开Y
类中定义的API。 getObject2()
仅在其后代上定义。即使向量中的成员实际上是Z
的实例,只要它们作为Y类型的实例进行访问,那么只有Y
的接口可用。
如果您希望getObject2()
可用,则需要执行以下三项操作之一:
1.向getObject2()
添加虚拟Y
方法
2.将getObject2()
功能完全移至Y
3.将cont
设为vector<Z*>