2

在 Perl 中,有一个 UNIVERSAL::can 方法可以调用任何类或对象来确定它是否能够做某事:

sub FooBar::foo {}
print "Yup!\n" if FooBar->can('foo'); #prints "Yup!"

假设我在 C++ 中有一个基类指针,它可以是许多不同的派生类中的任何一个,有没有一种简单的方法来完成类似的事情?我不想触及其他派生类中的任何内容,我只能更改基类中调用该函数的区域,以及支持它的一个派生类。

编辑:等等,这现在很明显(不要管这个问题),我可以在返回一个代表 UNIMPLEMENTED 的数字的基础中实现它,然后在调用它时检查返回不是这个。我不知道为什么我会以如此复杂的方式思考事情。

我还想我会从另一个实现的类中派生出我的类,foo然后看看对这个类的动态转换是否有效。

4

4 回答 4

7

如果您有一个基类的指针或引用,您可以使用dynamic_cast它来查看它是哪个派生类(以及因此它支持哪个派生类的方法)。

于 2009-09-03T18:33:12.457 回答
5

如果您可以向基类添加方法,则可以virtual bool can_foo() {return false;}在具有 foo 的子类中添加并覆盖它以返回 true。

于 2009-09-03T18:35:02.873 回答
3

C++ 没有内置的运行时反射。您可以完全自由地将自己的反射实现构建到您的类层次结构中。这通常涉及使用名称和功能列表填充的静态映射。您必须手动注册您想要使用的每个函数,并在调用约定和函数签名方面保持一致。

于 2009-09-03T18:33:44.217 回答
2

我相信最正确的方法是使用 typeid<> 运算符并获取对 type_info 对象的引用,然后您可以将该(== 运算符)与您希望关心的数据类型的所需 type_info 进行比较。

这不会为您提供方法级别的检查,并且确实需要您在启用 RTTI 的情况下进行构建(我相信在没有 RTTI 的情况下构建的对象上使用 typeid<> 会导致“未定义”行为),但是您是.

MSDN 有一个在线参考可以帮助您入门:http: //msdn.microsoft.com/en-us/library/b2ay8610%28VS.80%29.aspx

于 2009-09-03T18:47:51.657 回答