类有虚函数吗? C ++

时间:2014-06-10 12:27:24

标签: c++ casting virtual virtual-functions

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

我通过动态演员考虑的第一种方式。

 class A
 {
// hidden details..
 };

 class B:public A{};

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

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

  

错误:无法在dynamic_cast \ u2018a(类型为\ u2018class A * \ u2019)键入\ u2018class B * \ u2019(源类型不是多态的)

有没有办法检查这个没有编译错误? 注意:我没有c ++ 11或提升支持!

1 个答案:

答案 0 :(得分:8)

您可以通过将类型大小与类型大小与添加的虚拟方法进行比较来测试虚拟方法是否存在。标准不保证这种类型的检查,并且可以被虚拟继承所欺骗,因此不应该在生产代码中使用它。但是,对于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>()调用测试。