gpt4 book ai didi

C++多重继承,与派生对象中基类的地址混淆

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:35 25 4
gpt4 key购买 nike

为什么下面的代码打印01
我预计 00。如果地址不相等,为什么 operator== 在第一种情况下返回 true?

#include <iostream>

class B1
{
int m_i;
};

class B2
{
double m_d;
};

class D
: public B1
, public B2
{
};

int main()
{
D d;
B2 *b2 = &d;

std::cout << "d:\t" << reinterpret_cast<void*>(&d) << "\t" << &d << "\n";
std::cout << "b2:\t" << reinterpret_cast<void*>(b2) << "\t" << b2 << "\n";


std::cout << (reinterpret_cast<void*>(b2) == reinterpret_cast<void*>(&d));
std::cout << (b2 == &d);

return 0;
}

给出输出:

d:  0xbfd65fa4  0xbfd65fa4
b2: 0xbfd65fa8 0xbfd65fa8

01

最佳答案

当您比较 b2&d 而不转换为 void 时,编译器会隐式地将它们转换为通用数据类型 - 在本例中为 d 被隐式转换为其 B2 基类。

当您通过转换为 void 进行比较时,您将获得对象的真实底层地址,并且由于 DB2 之前继承自 B1这是它的 B1 基类的地址。

关于C++多重继承,与派生对象中基类的地址混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19022855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com