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

use*_*100 1 c++ pointers derived base memory-address

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

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

我可能对地址如何在继承中使用C++有很大的误解.也许它们只是一个对象,而不是链接到派生对象的基础对象?

非常感谢你

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

Dav*_*men 5

从指向派生类的指针到指向基类的指针很简单:

Derived * derived_ptr = < some pointer >;
Base * base_ptr = derived_ptr;
Run Code Online (Sandbox Code Playgroud)

如果你想变得迂腐,你可以static_cast在任务的右侧使用:

Base * base_ptr = static_cast<Base*>(derived_ptr);
Run Code Online (Sandbox Code Playgroud)

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

Derived * derived_ptr = dynamic_cast<Derived*>(base_ptr);
Run Code Online (Sandbox Code Playgroud)

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

在你这样做之前,你为什么需要从基指针转到派生指针?这是一个线索,您可能需要重新考虑您的设计.

  • s /冗余/非常危险/.如果您使用static_cast并使层次结构变得混乱,或者将来发生变化,那么您可能会最终执行向下转换为与运行时类型不匹配的类型 - 未定义的行为.如果你把它保留为普通的赋值,并且该赋值不再是upcast,那么它也将停止编译.风险小,但仅仅为了编写额外的代码而几乎不值得. (2认同)