识别基类指针指向的子类对象
Posted
技术标签:
【中文标题】识别基类指针指向的子类对象【英文标题】:Identifying what child class object a base class pointer is pointing at 【发布时间】:2016-11-28 08:22:56 【问题描述】:是一种识别基类指向哪个子对象的方法。
例如:
class Base
..;
class Child1:public Base
..;
class Child2:public Base
..;
void identifyChild(Base *obj)
if((Child1*)&obj)//not working
cout<<"child1";
else
cout<<"child2";
int main()
..
identifyChild(&c);// c can be child 1 or child2 ;
..
child1
和child2
是继承class base
的两个类。
我想知道如何检查基类指针obj指向的对象是什么类型。
另外, 我想避免使用任何 STL 成员,不使用模板或 typeinfo 标头相关函数,只使用指针解决这个问题,旧的 C++ 方式。
这可能吗?
【问题讨论】:
要解决您的问题,请尝试使用dynamic_cast
进行向下转换。 然而这样做通常不是一个好主意,而且往往是糟糕设计的标志。用例是什么?你为什么需要这个?用虚函数不能解决问题吗?您想解决的实际问题是什么(related reading about the XY problem)?
是否有任何与仅使用指针进行转换相关的解决方案?我想坚持与指针相关的操作,那么有没有这样的方法?根据对象的类型,我将调用不同的函数。但是,我的重点是找出对象指向的类型。不,我不喜欢使用虚函数。
我仍然不推荐它,但使用dynamic_cast
向下转换似乎是您想要的(但可能不需要)。
好吧,我认为动态演员应该这样做......
【参考方案1】:
添加虚拟类,它会告诉你类名如下:
class Base
public:
virtual string getClassName() = 0;
;
class Child1 :public Base
string getClassName()
return string("Child1");
;
class Child2 :public Base
string getClassName()
return string("Child2");
;
void identifyChild(Base *obj)
if (obj->getClassName() == "child1")
cout << "child1";
else
cout << "child2";
【讨论】:
【参考方案2】:您可以在基类中包含一个虚函数并为每个返回某种类型信息的继承类覆盖它,或者您可以使用 dynamic_cast 对每种类型进行测试。第一个建议更高效,更不容易出错。
但实际上,您似乎是在问如何实施解决方案,而不是告诉我们您要解决的问题是什么,因为我的建议都不是一件好事。
【讨论】:
以上是关于识别基类指针指向的子类对象的主要内容,如果未能解决你的问题,请参考以下文章