This question already has answers here:
Test whether a class is polymorphic

(5个答案)


已关闭6年。




因此,我有一个类,想确定它是否具有虚函数。

我考虑的第一种方法是动态转换。
 class A
 {
// hidden details..
 };

 class B:public A{};

 int main()
 {
    A *a = new A;;
    B* b = dynamic_cast<B*>(a);
 }

因此,在这种情况下,如果类A中存在虚函数,则编译将成功,否则,将发生此错误:



有没有一种方法可以检查此结果而不会出现编译错误?
注意:我没有c++ 11或boost支持!

最佳答案

您可以通过比较类型的大小和添加了虚拟方法的类型的大小来测试虚拟方法的存在。该类型的检查不是标准所保证的,并且可以通过虚拟继承来欺骗,因此不应在生产代码中使用它。但是,对于C++ 11 std::is_polymorphic不可用的简单情况,它仍然有用。在g++ 4.6下测试:

template<typename T>
class VirtualTest: private T {
    virtual void my_secret_virtual();
};

template<typename T>
bool has_virtual() {
    return sizeof(T) == sizeof(VirtualTest<T>);
}

将测试作为has_virtual<A>()调用。

10-06 13:25