我在强制更改我自己的对象上的数据类型时遇到问题。我有一个基类说A
和两个派生自的类A
called B
and C
。我传递物体B
and C
到一个检查它是什么类型的对象的函数(B
or C
)。下面是一些示例代码以及我的问题的问题:
enum ClassType {"B", "C"};
class A {
protected:
m_Type;
public:
ClassType Type() { return m_Type}
...
...
};
class B : public A {
otherMemberFunctions();
}
class C : public A {
otherMemberFunctions();
}
void WhatType(vector<A*>* candidates){
vector<B*> b_candidates(0);
vector<C*> c_candidates(0);
for(int i = 0; i < candidates->size(); i++){
if(candidates->at(i)->Type() == B ){
B* b = (B*) candidates->at(i);
b_candidates(b);
}
//Same idea for Object C
}
}
然后我会用WhatType(vector<A*>* candidates)
如下
vector<B*>* b_example
WhatType((vector<A*>*) b_exmaple)
当我填满新的vector
函数中的 b_candidatesWhatType
。我仍然可以访问 中的成员函数吗?B
对象还是我只能访问基类中的成员函数A
?
当我更改对象的类型时,我对对象发生的情况感到困惑。
Here
WhatType((vector<A*>*) b_exmaple)
and here
B* b = (B*) candidates->at(i);
当您收到指向多态对象的指针时,您有两种类型:对象的“静态”类型,在您的情况下,它将是A *
及其“动态”或“真实”类型,这取决于实际分配给它的内容。
铸造你的A *
to B *
强制编译器将该指针视为指向B
;只要您确实知道该指针,这就是安全的实际上是一个指向B
,否则编译器将开始编写无意义的代码(调用B
另一种类型的数据的方法)。
您尝试实现的检查是 RTTI 的本地版本,它是一种机制,允许您知道哪个是指针的“真实类型”或多态类的引用,并安全地执行此类强制转换。查看typeid
and dynamic_cast
有关详细信息,请参阅 C++ 手册。 (顺便说一下,IIRCdynamic_cast
不仅是为了防止动态类型错误时的安全,而且如果您在复杂的类层次结构中使用它,它还可能对您的指针执行一些额外的魔法;因此,避免对多态类进行 C 风格转换)
顺便说一句,一般来说,必须手动检查指针的“真实类型”才能转换它并使用它的方法,这被认为是“代码味道”:OOP 理想只能在以下情况下完成这项工作:virtual
基类中可用的方法。
大警告:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)