调用虚拟函数而不通过类类型指针创建任何对象?

时间:2019-01-03 14:40:47

标签: c++ virtual-functions

我想了解以下程序的工作原理。

class A{
    public:
    virtual void fun();
};

void A:: fun()
{
    cout << "fun() called";
}

int main() {

    A *ptr_a;
    ptr_a->fun();
    return 0;
}

它不打印“被调用的fun()”。我试图为此找到合理的解释,但我没有。如果我从声明中删除虚拟,则可以正常工作。同样也没有运行时错误。

1 个答案:

答案 0 :(得分:3)

没有理由指望它能起作用,也没有理由指望它不起作用。

您正在通过未初始化且无效的指针在不存在的对象上调用函数。

任何事情都会发生。

任何事情。

在实践中,您不会看到出色的虚拟调度结果,因为这些结果依赖于存储在不存在的对象中的数据,而普通的函数调用更为简单,并且可以“发生”而无需真的取消了指针的引用。

但这确实不重要,因为编译器很复杂,并且在翻译过程中很容易从您的代码中丢失所有预期的含义(无论是具有未定义行为的程序!)。和优化。

一种不太关心“为我不使用的东西付钱”的语言可能会造成一个严重的错误,但这不是C ++的工作原理。