【问题标题】:C++: Assigning derived class pointer to base class pointerC ++:将派生类指针分配给基类指针
【发布时间】:2021-09-09 07:14:56
【问题描述】:

对 C++ 不是很熟悉,因此对于这个可能令人讨厌的问题深表歉意(尽管有一些类似的问题,但我找不到答案)。

在我正在处理的代码库中(抱歉,无法共享确切的代码),有一个 Base 类和一个 Derived 类。我有一个指向派生类的指针,d

在某个时候,我设置了

Base* b = d;

超级奇怪的是指针最终会得到不同的值! b 最终得到的地址正好比 d 大 8。

我无法使用直接的 Base/Derived 类来重现这一点,所以我确信在我正在使用的特定类中正在做一些事情。

谁能解释一下这怎么可能? C++ 中的什么可能允许这样的事情?

提前致谢!

【问题讨论】:

  • 我不认为 C++ 与地址有任何关系
  • 对不起,你必须想出更多。到目前为止,您提到的任何事情都不会导致它,如果您已经创建了一个不会重现它的最小示例,那么您的程序中显然还有其他东西会产生影响。将指针分配给指针永远会在传输中改变指针的值。
  • 嗨 Silvio,这确实是我一直在寻找的答案。作为一个新手 C++ 程序员,我只是想确认这不应该发生,我猜。随意添加您的评论作为答案。
  • 提示:将你的类定义复制到一个单独的项目中,并虚设你需要的东西来编译你的一行。然后开始删除班级成员。您应该能够将定义缩短到几行,足够短以更改名称并显示为minimal reproducible example,而无需共享商业机密。 (我的猜测是涉及到虚继承,只是为了和人们猜测虚函数表不同。)

标签: c++ c++11 pointers c++17


【解决方案1】:

我不确定您的问题,但基本上,指针用于指向/存储分配给指针变量的变量的地址。要检查指针值,使用 *b, b, &b 来检查值,存储在指针中的地址,准确的 8 可能是由于派生类的地址

【讨论】:

    【解决方案2】:

    超级奇怪的是指针最终会得到不同的值!

    这其实很正常。 b 是一个指向基础子对象的指针。不能保证基本子对象存储在封闭派生对象的开头。事实上,如果类具有虚函数,则通常不是这样,因为语言实现通常将虚指针存储在其中(虚指针是 C++ 程序员几乎不需要知道的实现细节)。

    还要考虑多重继承。如果有多个非空基,那么它们肯定不能都存储在同一个地址。

    【讨论】:

    • 感谢您的明确答复!我的背景主要是 Java,所以派生类“包含”基类的概念对我来说是陌生的。直到:)
    • @KenKatagiri 我可能是错的,但我会假设 Java 还将基存储在派生对象中。或者,派生对象可能只包含一个指向基础对象的指针。没有办法观察 Java 中这些实现细节之间的区别(我再次假设;我不太了解 Java)。
    • 是的,我猜 java 在幕后也是这样做的,我们只是被这些细节屏蔽了。
    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多