Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么基类指针指向基类中的纯虚方法而不是派生类中的overidden方法?_C++_Inheritance_Gcc_Run Time Polymorphism - Fatal编程技术网

C++ 为什么基类指针指向基类中的纯虚方法而不是派生类中的overidden方法?

C++ 为什么基类指针指向基类中的纯虚方法而不是派生类中的overidden方法?,c++,inheritance,gcc,run-time-polymorphism,C++,Inheritance,Gcc,Run Time Polymorphism,按值传递的示例输出: Foo: 0x7fffe90a24e0 1B B: 10 我对为什么会发生这种情况有一种模糊的预感,我正在寻找一些文献或参考资料来证明或反驳我的假设:当通过引用传递时,基类指针a_ptr指向一个实体,其生存期超过了对a_ptr->foo的调用 但是,当按值传递时,_ptr指向一个临时值,该临时值在构造函数退出时丢失 我想这与A的VTABLE有关,但我不能完全指出它。是的,你的怀疑是正确的 当B对象通过值传递到Foo构造函数中时,它将成为构造函数的局部变量。构造

按值传递的示例输出:

Foo: 0x7fffe90a24e0      1B
B: 10

我对为什么会发生这种情况有一种模糊的预感,我正在寻找一些文献或参考资料来证明或反驳我的假设:当通过引用传递时,基类指针a_ptr指向一个实体,其生存期超过了对a_ptr->foo的调用

但是,当按值传递时,_ptr指向一个临时值,该临时值在构造函数退出时丢失


我想这与A的VTABLE有关,但我不能完全指出它。

是的,你的怀疑是正确的

当B对象通过值传递到Foo构造函数中时,它将成为构造函数的局部变量。构造函数正在保存指向该本地对象的指针,该对象在构造函数退出时超出范围


因此,在foo::dummy中对a_ptr->foo的调用实际上是未定义的行为,因为a_ptr甚至没有指向有效的对象。但是,它并没有真正崩溃,因为A::foo没有将其this指针用于任何事情。它只是指向一个编译器定义的函数,该函数抛出一个称为error的纯虚拟方法,而您没有捕获该方法,因此您的程序终止。

是的,您的怀疑是正确的

当B对象通过值传递到Foo构造函数中时,它将成为构造函数的局部变量。构造函数正在保存指向该本地对象的指针,该对象在构造函数退出时超出范围


因此,在foo::dummy中对a_ptr->foo的调用实际上是未定义的行为,因为a_ptr甚至没有指向有效的对象。但是,它并没有真正崩溃,因为A::foo没有将其this指针用于任何事情。它只是指向一个编译器定义的函数,该函数抛出一个称为error的纯虚拟方法,而您没有捕获该方法,因此您的程序终止。

您通过引用a*类型的_ptr来分配临时对象B。在构造函数退出时,此临时对象已被销毁。因为VTABLE也被销毁了,称为A::foo,它是纯虚拟的。所以您得到了它。

您通过引用a类型的a_ptr来分配临时对象B*。在构造函数退出时,此临时对象已被销毁。因为VTABLE也被销毁了,称为A::foo,它是纯虚拟的。你明白了。

?我可能把这个关错了。你把Foo B&x{a_ptr=&x;}改成Foo B x{a_ptr=&x;}了吗?我不认为这是对象切片,它是指向临时对象的指针,请发布一个。到目前为止,您只发布了没有显示您描述的问题的代码。显示不起作用的代码,而不是起作用的代码。我可能关闭此错误。你把Foo B&x{a_ptr=&x;}改成Foo B x{a_ptr=&x;}了吗?我不认为这是对象切片,它是指向临时对象的指针,请发布一个。到目前为止,您只发布了没有显示您描述的问题的代码。显示不工作的代码,而不是工作的代码。
Foo: 0x7fffe90a24e0      1B
B: 10

Foo: 0x7fffc6bbab20      1A
pure virtual method called
terminate called without an active exception
Aborted (core dumped)