这一节是一个主意点
- 阅读下面代码:
#include "stdafx.h"
#include <iostream>
using namespace std;
class Father
{
public:
Father(int a)
{
this->a = a;
}
virtual void Print()
{
cout << "Father Print()" << endl;
}
private:
int a;
};
class Son : public Father
{
public:
Son(int a):Father(a)
{
}
virtual void Print()
{
cout << "Son Print()" << endl;
}
};
int main()
{
Father* p;
Son array[] = { Son(1),Son(2),Son(3) };
int i;
for (i = 0, p = &array[0]; i < 3; i++, p++)
{
p->Print();
}
return 0;
}
结果: 输出三次 Son Print(),
将子类添加一个变量 int b 再重新测试:
#include "stdafx.h"
#include <iostream>
using namespace std;
class Father
{
public:
Father(int a)
{
this->a = a;
}
virtual void Print()
{
cout << "Father Print()" << endl;
}
private:
int a;
};
class Son : public Father
{
public:
Son(int a,int b):Father(a)
{
this->b = b;
}
virtual void Print()
{
cout << "Son Print()" << endl;
}
private:
int b;
};
int main()
{
Father* p;
Son array[] = { Son(1,2),Son(2,3),Son(3,4) };
int i;
for (i = 0, p = &array[0]; i < 3; i++, p++)
{
p->Print();
}
return 0;
}
会发现程序奔溃,因为上次代码父类和子类的大小一样, 都只有一个变量 int a,所以用父类指针指向子类对象,p++刚好可以,如果子类有自己的变量,则父类的指针p++不会指向下个子类的首地址,程序崩溃。
结论: 指针++,会根据指针类型的大小++,更不是简单的+1,对于多态,禁止使用父类指针++等操作
本文深入探讨了C++中多态的概念,特别是在父类指针指向子类对象并进行递增操作时可能遇到的问题。通过具体代码示例,揭示了当子类拥有额外成员变量时,父类指针递增导致的内存访问错误,强调了在多态编程中正确处理指针的重要性。
1665

被折叠的 条评论
为什么被折叠?



