我教授C++编程课程,我已经见过足够多的错误类别,以至于我对如何诊断常见的C++错误有了良好的感觉。然而,有一种主要类型的错误,我的直觉并不特别准确:什么样的编程错误会导致调用纯虚函数? 我见过最常见的导致这种错误的情况是从基类构造函数或析构函数中调用虚函数。在帮助调试学生代码时,还有其他需要注意的情况吗?
我教授C++编程课程,我已经见过足够多的错误类别,以至于我对如何诊断常见的C++错误有了良好的感觉。然而,有一种主要类型的错误,我的直觉并不特别准确:什么样的编程错误会导致调用纯虚函数? 我见过最常见的导致这种错误的情况是从基类构造函数或析构函数中调用虚函数。在帮助调试学生代码时,还有其他需要注意的情况吗?
reinterpret_cast
等。 - Tony Delroystatic_cast
转换为错误类型(或C风格的转换)也可能导致您所指向的对象在其虚表中没有正确的方法(在这种情况下,它确实是一个虚表,与前一选项不同)。这种情况可能发生在对象的引用或指针指向 NULL 位置时,您使用对象引用或指针调用类中的虚函数。例如:
std::vector <DerivedClass> objContainer;
if (!objContainer.empty())
const BaseClass& objRef = objContainer.front();
// Do some processing using objRef and then you erase the first
// element of objContainer
objContainer.erase(objContainer.begin());
const std::string& name = objRef.name();
// -> (name() is a pure virtual function in base class,
// which has been implemented in DerivedClass).
此时存储在 objContainer[0] 中的对象不存在。当虚拟表被索引时,找不到有效的内存位置。因此,会发出运行时错误,提示“调用了纯虚函数”。