Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类是否具有虚函数?c++;_C++_Casting_Virtual_Virtual Functions - Fatal编程技术网

C++ 类是否具有虚函数?c++;

C++ 类是否具有虚函数?c++;,c++,casting,virtual,virtual-functions,C++,Casting,Virtual,Virtual Functions,因此,我有一个类,并想确定它是否具有虚函数 我考虑的第一种方法是动态cast class A { // hidden details.. }; class B:public A{}; int main() { A *a = new A;; B* b = dynamic_cast<B*>(a); } A类 { //隐藏的细节。。 }; B类:公共A{}; int main() { A*A=新的A;; B*B=动态_型铸造(a); } 因此,在这种情

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

我考虑的第一种方法是动态cast

 class A
 {
// hidden details..
 };

 class B:public A{};

 int main()
 {
    A *a = new A;;
    B* b = dynamic_cast<B*>(a);
 }
A类
{
//隐藏的细节。。
};
B类:公共A{};
int main()
{
A*A=新的A;;
B*B=动态_型铸造(a);
}
因此,在这种情况下,如果类a中存在虚拟函数,编译将成功,否则,将发生以下错误:

错误:无法将\u2018a\u2019(类型为\u2018class A*\u2019)动态\u转换为类型\u2018class B*\u2019(源类型不是多态的)

有没有办法在没有编译错误的情况下检查这个问题?
注意:我没有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>);
}
模板
类虚拟测试:私有测试{
虚拟void my_secret_virtual();
};
模板
布尔有虚拟的{
返回sizeof(T)=sizeof(VirtualTest);
}

调用测试作为
has\u virtual()

参见此处:std::is\u多态性是您想要的。参见。这是从c++11开始支持的。如果我没有弄错,如果我没有得到这样的支持,该怎么办?您有boost吗?你应该在问题中指定这样的要求。如果类型T没有公共构造函数怎么办?@EduardRostomyan一点问题都没有-
从未尝试构造
T
。请你解释一下为什么不构造它?它不适用于VC++(至少在要测试的类具有虚拟继承的情况下不会),并且可能不会与许多其他编译器一起使用。@EduardRostomyan“构造”类型意味着使用诸如
T()
new T()之类的构造创建实例
,或者通过调用调用此类构造的模板库函数。
has\u virtual
不执行这些操作,它只调用
T
上的
sizeof
,以及继承
T
的类型。