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是的,我不知道“假定”是什么意思,但我就是这么想的^_^