用布鲁斯·艾克尔的“C++中的思维”学习C++。坚持练习30。下面是:
如果对通过值传递的对象的函数调用没有早期绑定,则虚拟调用可能访问不存在的部分。这个是可能的吗?编写一些代码来强制进行虚拟调用,并查看这是否会导致崩溃。若要解释行为,请检查按值传递对象时发生的情况。
我可以理解为对象调用虚拟函数的结果,但是如果没有调用适当的构造函数,我就无法理解如何强制编译器这样做。
是否有一种方法可以将一个对象视为另一个对象,而不调用适当的构造函数或运算符(用于类型转换)?
发布于 2012-10-18 15:06:22
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;
}此代码输出(链接到理想国)
world
hello即使您希望world类型的对象“表示”world,而不是hello。C++编译器聪明地注意到w是通过值传递给hello的,因此它调整vtable以避免调用派生类中的方法。
额外的练习来测试你是否理解通过引用传递:你能修改我的代码以便它打印worldworld吗?您可以插入一个字符。
发布于 2012-10-18 14:59:35
尽管在没有适当运算符的情况下,不能将对象从一种类型转换为另一种类型,但您可以使用指针并使用static_cast<>、dynamic_cast<>或reinterpret_cast<>进行转换。
https://stackoverflow.com/questions/12957628
复制相似问题