在c++中如何断言一个对象有某个方法?或者当您尝试调用它但它不存在时抛出异常?这是我应该做的来处理我的问题吗?
我有一个容器类,里面有一个自定义对象。在容器方法中,我想调用“较小”对象的方法,但我需要先确保它存在。
我可能不应该将所需的方法作为此类中的纯虚函数,因为它也被不需要它以这种方式使用的不同容器类以其他方式使用。对吧?
最佳答案
C++ 不提供运行时检查是否存在手头特定对象的方法。但是您可以通过两种主要方式克服这个问题:(1) 在某些公共(public)基类级别使用(纯)虚函数,或者 (2) 检查手头对象的类型。
(1)纯虚函数方式:
class ContainerObject {
...
virtual void somethingSpecific() = 0;
}
class MyContainerObject : public ContainerObject {
...
virtual void somethingSpecific() { ... }
}
因此,如果您获得一个指向ContainerObject
类型对象的指针,您可以依赖成员函数somethingSpecific()
的存在;请注意 ContainerObject
类是抽象的,因为它包含一个纯虚函数,即没有实现的虚成员函数:
ContainerObject *o = someContainer.getSomeObject();
o->somethingSpecific(); // compiler checks existence of `somethingSpecific`.
(2) 类型检查方法:
但是,如果您不想在一般级别公开somethingSpecific
,您可以使用类型检查,例如动态类型转换。假设与上面类似的示例,但在 ContainerObject
类级别没有纯虚函数 somethingSpecific
:
class ContainerObject {
...
virtual void anyOtherVirtualFunction();
}
class MyContainerObject : public ContainerObject {
...
virtual void somethingSpecific() { ... }
}
基于动态转换的运行时类型检查然后尝试将 getSomeObject
返回的对象解释为 MyContainerObject
:
MyContainerObject *o = dynamic_cast<MyContainerObject*>(someContainer.getSomeObject());
if (o != nullptr) // does o point to a MyContainerObject?
o->somethingSpecific();
请注意,getSomeObject
可能会返回一个不同于 MyContainerObject
的对象。在这种情况下,动态转换的结果将为空。因此,如果结果不为空,那么您可以依赖 o
指向 MyContainerObject
实例(它实现了 somethingSpecific
)。
进一步注意,动态转换要求多态性到位,这意味着基类 ContainerObject
必须至少有一个虚拟成员函数(本例中为 anyOtherVirtualFunction
).
希望对您有所帮助。
关于c++ - 你如何断言一个对象在 C++ 中有一个特定的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41643087/