Vij*_*der 2 c++ oop polymorphism
#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;
}
Run Code Online (Sandbox Code Playgroud)
为什么输出以上代码呢?
00000
01010
当我写作
SomeFunc(DeriArr,5);
Run Code Online (Sandbox Code Playgroud)
怎么了?基指针如何处理派生对象?
小智 6
你在这里经历了一些切片.基类的大小为(比方说)4,派生类的大小为8.将派生对象数组传递给函数并推进基类指针(通过4个字节的偏移量)产生交替序列0和1.
如果你想保持多态,你应该给你的基类一个虚拟析构函数,并将一个指针数组(例如std :: shared_ptr)传递给你的函数.
插图:
让基础对象持有一个整数:
int bval
Run Code Online (Sandbox Code Playgroud)
包含两个整数的派生对象:
int bval
int dval
Run Code Online (Sandbox Code Playgroud)
并承诺一个内存位置保持连续的基础对象:
Offset Value Pointer
0 0 <- base_pointer
4 0
8 0
12 0
16 0
Run Code Online (Sandbox Code Playgroud)
但是通过一个存储位置来保存衍生的派生对象:
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
Run Code Online (Sandbox Code Playgroud)
并且将基指针前进一个(这意味着4个字节的偏移量),但不是派生指针,会产生切片.