c ++对象的虚函数调用

时间:2012-10-18 14:56:53

标签: c++ object polymorphism

在Bruce Eckel的帮助下学习C ++“用C ++思考”。坚持锻炼30.这是:

  

如果对按值传递的对象的函数调用不是早期绑定的,则a   虚拟呼叫可能会访问不存在的部分。这可能吗?   写一些代码来强制虚拟调用,看看是否会导致虚拟调用   崩溃。要解释这种行为,请检查传递时会发生什么   按价值对象。

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

有没有办法在不调用正确的构造函数或运算符(用于类型转换)的情况下将一个对象视为另一个对象?

2 个答案:

答案 0 :(得分:2)

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?您可以插入一个字符。

答案 1 :(得分:0)

虽然在没有适当的运算符的情况下无法将对象从一种类型转换为另一种类型,但您可以使用指针并使用static_cast&lt;&gt;进行强制转换。或dynamic_cast&lt;&gt;或reinterpret_cast&lt;&gt;