我想了解以下程序的工作原理。
class A{
public:
virtual void fun();
};
void A:: fun()
{
cout << "fun() called";
}
int main() {
A *ptr_a;
ptr_a->fun();
return 0;
}
它不打印“被调用的fun()”。我试图为此找到合理的解释,但我没有。如果我从声明中删除虚拟,则可以正常工作。同样也没有运行时错误。
答案 0 :(得分:3)
没有理由指望它能起作用,也没有理由指望它不起作用。
您正在通过未初始化且无效的指针在不存在的对象上调用函数。
任何事情都会发生。
任何事情。
在实践中,您不会看到出色的虚拟调度结果,因为这些结果依赖于存储在不存在的对象中的数据,而普通的函数调用更为简单,并且可以“发生”而无需真的取消了指针的引用。
但这确实不重要,因为编译器很复杂,并且在翻译过程中很容易从您的代码中丢失所有预期的含义(无论是具有未定义行为的程序!)。和优化。
一种不太关心“为我不使用的东西付钱”的语言可能会造成一个严重的错误,但这不是C ++的工作原理。