2013-04-24 46 views
1

尽管我们正在打印bval,但输出结果也显示为值dval。编译器使用什么实际的逻辑?我的预期产出是00000 00000,但我获得输出为00000 01010使用指针工作时Inallitance不起作用

#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; 
} 
+2

未定义的行为。你不能多态地处理数组。寻找重复... – 2013-04-24 10:44:48

+0

或... http://stackoverflow.com/questions/1411844/polymorphism-pointers-to-arrays – 2013-04-24 10:47:07

回答

3

您正在欺骗系统,并获得“切片”。

由于deri大于base,因此当您执行arr++时,指针只会向前移动一个base对象。

的解决方案是让一个指针数组,并传递一个base **arr,像这样:

base *foo[5]; 
base BaseArr[5]; 
SomeFunc(BaseArr,5); 
for(int i = 0; i < 5; i++) 
{ 
    foo[i] = &BaseArr[i]; 
} 
SomeFunc(foo, 5);