首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从派生对象获取基对象的地址

从派生对象获取基对象的地址
EN

Stack Overflow用户
提问于 2011-06-18 21:03:35
回答 3查看 3.5K关注 0票数 1

我的程序中出现了一个非常令人困惑的错误。我想我可能在同一个类中有两个不同的对象,而我认为我有相同的对象。这是令人困惑的,因为我正在处理一个非常大的框架,在这个框架中获取我需要的对象的指针并不简单。

我的问题是,如果我有一个从Base继承的派生类,并且我有一个指向派生对象的指针,我如何从派生对象中获得Base对象的地址?我正在使用基类的源代码,并打印出"this“在Base中的地址。在我代码的另一部分中,a检索一个指向派生的指针。我需要能够通过我的派生对象打印基对象的地址,以确定我是否有指向所需特定派生对象的指针。

我可能对继承中的地址在C++中的工作方式有很大的误解。也许它们只是一个对象,而不是链接到派生对象的基对象?

非常感谢

编辑:我想这样做的原因纯粹是为了调试。问题是,我使用的代码库没有包含很多接口或受保护的成员,因此我必须编辑源代码才能访问特定的信息。但是,当我使用特定的派生指针调用添加到基类中的方法时,程序会崩溃。在这种情况下,我需要能够打印基对象的地址,这样才能确定这是不是正确的对象,或者我是否得到了这个错误,因为我实际上有一个指向错误对象的指针。我意识到我可以向派生类添加代码以使其打印其地址,但我只是想知道是否可以在不再编辑源代码的情况下获得地址。谢谢

EN

回答 3

Stack Overflow用户

发布于 2011-06-18 21:14:52

从指向派生类的指针到指向基类的指针很容易:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Derived * derived_ptr = < some pointer >;
Base * base_ptr = derived_ptr;

如果你想学究,你可以在任务的右边使用static_cast

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Base * base_ptr = static_cast<Base*>(derived_ptr);

从指向基类的指针到指向派生类的指针使用dynamic_cast

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Derived * derived_ptr = dynamic_cast<Derived*>(base_ptr);

然而,这并不总是有效的。您需要启用运行时typeid,并且基类至少需要有一个虚方法。

在执行此操作之前,为什么需要从基指针转到派生指针?这是一个提示,你可能需要重新考虑你的设计。

票数 5
EN

Stack Overflow用户

发布于 2011-06-18 21:07:15

只有一个对象,它由一个基本对象和一个派生对象组成-也就是说,在大多数实现中,基本对象被放入内存中,紧挨着派生对象。这意味着基数*与一般情况下的派生数*不同,但它们将非常接近。

现在,您可以简单地从派生的*中获取Base*,强制转换是隐式的,但您也可以显式地使用它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Derived* dptr = ...;
Base* ptr = dptr;

但是,没有什么可以阻止单个派生对象包含多个Base对象。通常情况下不是这样,但它可能会发生。这意味着你不能比较Base指针并期望知道你是否在处理相同的对象,仅仅是相同的Base子对象。

票数 3
EN

Stack Overflow用户

发布于 2011-06-18 21:27:03

在简单的单继承情况下,使用大多数编译器:

如果你有一个指向派生类的指针,那么它和指向基类的指针是一样的。这两个指针具有相同的值并指向相同的存储器地址。

在内存中,如果创建一个派生类的实例,它将被布局为基对象的成员,后跟派生对象的成员。基类成员构成派生对象的一部分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Base
{
   int b;
};

class Derived : public Base
{
   int d;
};

在内存中,假设派生指针是0400。然后:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0400 byte 1 of b
0401 byte 2 of b
0402 byte 3 of b
0403 byte 4 of b
0404 byte 1 of d
0405 byte 2 of d
0406 byte 3 of d
0407 byte 4 of d

派生对象由基成员和派生的自己的成员组成,这两个成员的地址都从0400开始。

恰好如此,在0400,派生的基本对象部分被定位。因此,基本和派生具有相同的地址。

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

https://stackoverflow.com/questions/6398888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文