我需要一些帮助才能正确理解所有内容。
我想检查一个抽象类的指针,如果它是特定子类的实例。
我有一个抽象类“ 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 *”,不是我想知道的。
是否有解决此问题的方法?
答案 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所评论的那样,请参见虚拟方法的工作原理。
我希望它能提供帮助。