识别基类指针指向的子类对象

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 ;
 ..

child1child2 是继承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 对每种类型进行测试。第一个建议更高效,更不容易出错。

但实际上,您似乎是在问如何实施解决方案,而不是告诉我们您要解决的问题是什么,因为我的建议都不是一件好事。

【讨论】:

以上是关于识别基类指针指向的子类对象的主要内容,如果未能解决你的问题,请参考以下文章

如何将子类作为期望基类的函数的参数传递,然后将该对象传递给指向这些抽象类对象的指针向量?

基类与派生类,父类指针指向子类对象

C++获取基类指针所指子类对象的类名

条款7:为多态基类析构函数声明为virtual

将基类指针强制转换为子类指针后的疑惑

简单工厂类,有继承虚函数重写基类指针指向子类对象会发生多态