C++ 关于类继承的隐式转换

C++ Implicit conversion about class inherit

本文关键字:转换 继承 于类 C++      更新时间:2023-10-16
#include<iostream>
#include<map>
using namespace std;
class A{
public:
long a;
};
class B : public A {
public:
long b;
};
void seta(A* data, int idx) {
data[idx].a = 2;
}
int main(int argc, char* argv[]){
B data[4];
for (int i = 0; i<4; ++i){
data[i].a = 1;
data[i].b = 1;
seta(data, i);
}
for (int i = 0; i<4; ++i){
std::cout << data[i].a << data[i].b;
}
return 0;
}

打印结果为22221111

当我将A::a类型更改为双精度时,结果打印是20201111

当我将A::a类型更改为浮点数时,结果打印2107374182421073741821111

它是如何融合的?

指针算术不适用于运行时多态性。编写data[idx]时,*data必须具有与其静态类型相同的动态类型。换句话说,data必须指向类型为A的对象,而不是派生自A的某个类型。

由于上述内容不适用于您的程序,因此行为是未定义的。

你最好将你的属性初始化为 0 或 -1,这样你就可以确定它是否在变化。

long b=0;

您获得的随机值不是转换问题的值,而是StoryTeller评论的未定义行为。

最后,您的数据没有指向 A 类型的对象,这是所有混乱背后的原因。