我有两个类,B和C,子类化一个抽象类A和一个带有指向A param的指针的函数f。 有没有一种简单的方法让f()检测所获得的指针是指向B还是C?
class A {
//...
};
class B : public A {
//...
};
class C : public A {
//...
};
int f(A* arg);
答案 0 :(得分:3)
你不应该关心:这几乎就是多态性的全部内容。
但是,如果真的需要知道,你有两个(合理的)选择:
1)使用dynamic_cast
。对于指针强制转换,如果指针不是预期类型,则结果为nullptr
。对于引用转换,如果引用不是期望的类型,则抛出异常。
2)构建子类实现的虚函数,例如,表示类型的enum
。
(1)是优选的。但是,首先要考虑为什么需要这个。
答案 1 :(得分:1)
如果你发现自己不得不做这种事情,那么你就不会使用多态,可能需要检查你的设计。但您可以使用dynamic_cast
并测试:
B* b = dynamic_cast<B*>(someAPtr);
if (b)
{
// cast succeeded, object pointed at is-a-B
}
这将是一个使用多态的设计:
struct A {
virtual void foo() const {}
};
struct B : A {
void foo() const override {}
};
struct C : A {
void foo() const override {}
};
int f(A* arg) {
arg->foo();
return 42;
}
请注意override
specifier是C ++ 11。如果您的编译器不支持它,您可以省略它。它只是确保我不会错误地覆盖基类的虚方法。