在编程的时候经常会遇到基类的指针指向派生类的情况,这时候会发生一些有趣的事情。
1.函数的形参为指向基类的指针,但是传递进来的是派生类的对象,例如:
#include <iostream>
#include <stdio.h>
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()
{
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;
}
输出结果为:
这是因为传入的派生类对象呗转换成为基类对象,因此指针的长度减少了一半(因为没有了原来的派生类中的b成员变量),因此指针在递增的时候只递增了一半的长度,也就是说原来的值为abababab,但是在函数处理过程中全部变成了aaaaabab,这样结果的值就变成了22221111