gpt4 book ai didi

c++对象的虚函数调用

转载 作者:太空狗 更新时间:2023-10-29 21:47:33 26 4
gpt4 key购买 nike

在 Bruce Eckel“Thinking in C++”的帮助下学习 C++。卡在练习 30 中。这是:

If function calls to an object passed by value weren’t early-bound, a virtual call might access parts that didn’t exist. Is this possible? Write some code to force a virtual call, and see if this causes a crash. To explain the behavior, examine what happens when you pass an object by value.

我可以理解为对象调用虚函数的结果,但我无法理解如何在没有调用适当的构造函数的情况下强制编译器这样做。

有没有一种方法可以在不调用适当的构造函数或运算符(用于类型转换)的情况下将一个对象视为另一个对象?

最佳答案

Bruce 正在尝试说明对象切片,这是一种按值传递多态对象的情况。

这里是你如何做到的:

#include <iostream>
using namespace std;
struct hello {
virtual void say() { cout << "hello" << endl; }
};
struct world : public hello {
virtual void say() { cout << "world" << endl; }
};
void force(hello h) {
h.say();
}
int main() {
world w;
w.say();
force(w);
return 0;
}

此代码输出 ( link to ideone )

world
hello

即使您希望类型为 world 的对象“说”world,而不是hello。 C++ 编译器很聪明地注意到 w 按值传递给 hello ,因此它调整 vtable 以避免调用派生类中的方法。


测试您是否理解通过引用传递的额外练习:您可以修改我的代码以使其打印 world world 吗?您可以插入单个字符。

关于c++对象的虚函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12957628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com