多态性奇怪的输出
Polymorphism wierd Output
#include <iostream>
using namespace std;
class base {
public:
int bval;
base(){bval=0;}
};
class deri:public base {
public:
int dval;
deri(){dval=1;}
};
void SomeFunc(base*arr,int size) {
for(int i=0;i<size;i++,arr++) {
cout<<arr->bval;
}
cout<<endl;
}
int main() {
base BaseArr[5];
SomeFunc(BaseArr,5);
deri DeriArr[5];
SomeFunc(DeriArr,5);
return 0;
}
为什么上面代码的输出是这样的?
00000年01010年SomeFunc(DeriArr,5);
会发生什么?基指针arr如何处理派生对象?
您在这里经历了一些切片。基类的大小为(比方说)4,派生类的大小为8。传递一个派生对象数组给函数,并移动一个基类指针(偏移4个字节),得到一个交替的0和1序列。
如果你想保持它的多态,你应该给你的基类一个虚析构函数,并传递一个指针数组(例如std::shared_ptr)给你的函数。
说明:
基对象保存一个整数:
int bval
保存两个整数的派生对象:
int bval
int dval
并承诺存储连续基对象的内存位置:
Offset Value Pointer
0 0 <- base_pointer
4 0
8 0
12 0
16 0
但是传递一个存放连续派生对象的内存位置:
Offset Value Pointer
0 0 <- base_pointer <- derived_pointer
4 1 <- base_pointer + 1
8 0 <- base_pointer + 2 <- derived_pointer + 1
12 1 <- base_pointer + 3
16 0 <- base_pointer + 4 <- derived_pointer + 2
...
32 0 <- derived_pointer + 4
36 1
并将基指针移动1(这意味着偏移量为4字节),但不是派生指针,它屈服于切片。
基指针并不真正处理派生对象。通过一个对象的任何基类来寻址它是合法的,但是一旦你在处理基类的代码中,它就不再知道它实际上是一个派生类。
所以当你增加arr指针时,它在内存中移动'base'的大小。实际上,它应该按deri的大小递增,但不幸的是,它不再知道对象的类型是deri。
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 如何在这个简单的最小示例中实现多态性?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- C++ 继承和多态性未知输出
- 多态性奇怪的输出
- 多态性中的多类型输出
- 多态性 c++ 错误输出
- 与多态性一起使用的数组的奇怪输出