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

C++ 只通过类类型指针调用虚函数而不创建任何对象?,c++,virtual-functions,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; } A类{ 公众: 虚拟虚空乐趣(); }; void A::fun() { coutfun(); 返回0; } 它不会打印“fun(

我想了解以下程序是如何工作的

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

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

int main() {

    A *ptr_a;
    ptr_a->fun();
    return 0;
}
A类{
公众:
虚拟虚空乐趣();
};
void A::fun()
{
coutfun();
返回0;
}

它不会打印“fun()调用”。我试图找到一个合理的解释,但我做不到。如果我从声明中删除virtual,那么它可以正常工作。此外,也没有运行时错误。

没有理由期望它工作,也没有理由期望它不工作

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

任何事情都有可能发生

什么都行

实际上,您不会看到很好的虚拟分派结果,因为这些结果依赖于存储在不存在的对象中的数据,而普通函数调用更简单,可以“直接发生”,而不需要真正取消引用指针

但这并不是重点,因为编译器非常复杂,在翻译和优化过程中,所有预期的意义(不管是什么,在行为未定义的程序中!)都很容易从代码中丢失


一种对“我不使用的东西付钱”的语言会让这个错误变得更严重,但是C++并不是这样工作的。你没有任何对象指向related/dupe:因为你的函数没有使用类的成员变量,它通常会通过伪指针或空指针调用它,但它仍然是错误的,总有一天会回来困扰你。如果我让函数纯虚拟,那么当我调用纯虚函数时,编译器应该抛出错误?不是吗?值得注意的是,如果你要求编译器警告你,这是一个警告:我的观点是,如果fun()被执行,那么为什么它不打印&如果它没有被执行,那么为什么调用fun()不会引发任何编译/运行时错误?@卑鄙的请参阅我的最后一段。C++使你承担了诸如这样的错误的责任。原因有很多。研究“未定义的行为”了解更多关于这个话题的信息。“硬”是指“确定性”,现在?@curiousguy是的,我不知道“假定”是什么意思,但我就是这么想的^_^