为了询问在子类的实例中是否有指向抽象类的指针,我需要做什么?

时间:2019-05-10 13:45:58

标签: class object pointers c++-cli instanceof

我需要一些帮助才能正确理解所有内容。

我想检查一个抽象类的指针,如果它是特定子类的实例。

我有一个抽象类“ kunde”和两个子类“ firmenkunde”和“ privatkunde”,它们继承了kunde的方法。

为了通过“ int knr”(int客户编号)进行搜索,我使用一个指向“ kunde”的指针作为返回值。

在数据库类中,我获得“ kdstatus”并使用

kunde * kd = new privatkunde(0);

如果状态为PK或新的firmenkunde(0)如果状态为FK。 抽象类kunde没有可用于保存状态的任何属性。

我确实希望能够这样问,返回的指针是privatkunde还是firmenkunde类的实例。但是我没有找到任何方法可以做到这一点。

 MessageBox::Show(marshal_as<String^>(typeid(kd).name())); 

我确实问过typeid名称,但这只会返回“ class kunde *”,不是我想知道的。

是否有解决此问题的方法?

2 个答案:

答案 0 :(得分:0)

通常,您可以使用dynamic_cast

一个例子:

class Parent
{
public:
    virtual ~Parent();

    virtual void do_thing()= 0;
};

class Child1: public Parent
{
public:
    void do_thing() override
    {
        //...
    }
};

class Child2: public Parent
{
public:
    void do_thing() override
    {
        //...
    }
};

void use_parent(Parent* p)
{
    auto c1_ptr = dynamic_cast<Child1*>(p);
    if(c1_ptr != nullptr)
    {
        // p is a Child1

        do_thing_with_child1(c1_ptr);

    }
    auto c2_ptr = dynamic_cast<Child2*>(p);
    if(c2_ptr != nullptr)
    {
        // p is a Child2
        do_thing_with_child2(c2_ptr);
    }
}

尽管这可行,但是如果您有多个子类,则很难维护。您必须记住为定义的每个新子类添加一个案例。

构造这样的东西的一种更好的方法是在设计面向对象的系统时使用“告诉,不要问”的概念。 here可以找到有关此概念的出色文章。

答案 1 :(得分:0)

您可以使用typeid。使用多态性,您可以编写:

kunde * kd = new privatkunde(0);
if(typeid(kd) == typeid(privatkunde))
{
    // This is a privatkunde objet
}

有关更多说明,请参见here

您遇到的问题是您的kunde类不是多态的。正如@George所评论的那样,请参见虚拟方法的工作原理。

我希望它能提供帮助。