首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象的c++虚函数调用

对象的c++虚函数调用
EN

Stack Overflow用户
提问于 2012-10-18 14:56:52
回答 2查看 1.2K关注 0票数 3

用布鲁斯·艾克尔的“C++中的思维”学习C++。坚持练习30。下面是:

如果对通过值传递的对象的函数调用没有早期绑定,则虚拟调用可能访问不存在的部分。这个是可能的吗?编写一些代码来强制进行虚拟调用,并查看这是否会导致崩溃。若要解释行为,请检查按值传递对象时发生的情况。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-18 15:06:22

Bruce试图演示对象切片,这是一种通过值传递多态对象的情况。

以下是您可以这样做的方法:

代码语言:javascript
复制
#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;
}

此代码输出(链接到理想国)

代码语言:javascript
复制
world
hello

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

额外的练习来测试你是否理解通过引用传递:你能修改我的代码以便它打印worldworld吗?您可以插入一个字符。

票数 2
EN

Stack Overflow用户

发布于 2012-10-18 14:59:35

尽管在没有适当运算符的情况下,不能将对象从一种类型转换为另一种类型,但您可以使用指针并使用static_cast<>、dynamic_cast<>或reinterpret_cast<>进行转换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12957628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档