C++ 关于类继承的隐式转换
C++ Implicit conversion about class inherit
#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 类型的对象,这是所有混乱背后的原因。
相关文章:
- 继承模板化转换运算符
- 共享指针继承,而不先显式强制转换
- 事件系统:使用类型转换或联合进行继承
- 从继承的类C++强制转换
- 继承会导致不明确的转换
- 将 void* 强制转换为多个继承类的超类不会调用正确的方法
- C++ 关于类继承的隐式转换
- 使用类继承将单个喜欢的列表转换为双向链表
- 如何将C++继承的带有函数的类转换为C样式?
- C++ MSVC 中的访问冲突,但不在 GCC 中进行多重继承和强制转换
- 模板实例和继承的转换错误
- 为什么 GCC 在使用继承的构造函数时警告我无用的强制转换
- 为什么私有继承对象允许成员函数将派生的*转换为基*,而外部不能
- 在多重继承场景中动态强制转换类型
- 使用模板无法按预期工作进行继承和强制转换
- 将void*强制转换为具有多重继承的类
- 避免在继承的树类中进行下转换
- 继承 c++ 向上转换
- 多重继承强制转换未按预期工作
- 继承和隐式类型转换