c++ - C++中,为什么指针转换时地址变了?

标签 c++ oop pointers multiple-inheritance virtual-functions

代码如下:

#include <iostream>
using namespace std;

class B1 {
public:

  virtual void f1() {
      cout << "B1\n";
      }
};

class B2 {
public:

  virtual void f1() {
      cout << "B2\n";
      }
};        

class D : public B1, public B2 {
public:
  void f1() {
      cout << "OK\n" ;
  }
};

int main () {

D dd;    
B1 *b1d = &dd;
B2 *b2d = &dd;
D *ddd = &dd;

cout << b1d << endl;
cout << b2d << endl;
cout << ddd << endl;

b1d -> f1();
b2d -> f1();
ddd -> f1();
}

输出是:

0x79ffdf842ee0
0x79ffdf842ee8
0x79ffdf842ee0
OK
OK
OK

这让我感到困惑,因为我预计 b1db2d 会相同,因为它们都指向 dd。但是,b1db2d 的值根据结果不同。我认为这可能与类型转换有关,但我不确定它是如何工作的。

有人对此有想法吗?

最佳答案

D 继承自 B1B2

由于 B1 是从第一个对象继承的,因此将首先构造对象的 B1 部分,然后是对象的 B2 部分然后将创建 D

因此,当您将派生类型的指针转​​换为基类型时,您看到的是这些部分在内存中的不同之处。

b1dddd 具有相同的地址,因为它们都指向内存中类的开头。

b2d 是偏移量,因为它指向 DB2 部分的开始。

关于c++ - C++中,为什么指针转换时地址变了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34744599/

相关文章:

c++ - openCV features2D 中的 `query` 和 `train` 是什么

c++ - 如何从文本编辑QT中获取整个文本

java - 使用 "this."的优势

c - 双链表显示函数中的段错误

c++ - 显示基于 1 种类型的结构 vector 值

c++ - C++ 中 8 位整数和 32 位整数之间的按位与

php - 静态方法 : are they still bad considering PHP 5. 3 后期静态绑定(bind)?

c# - 了解 C# 接口(interface)

C 代码 - 猜谜游戏 - 函数问题

c - 对指针数组进行排序