关于父类和子类继承赋值问题
#include <iostream>
using namespace std;
class CFather //定义了一个父类
{
public:
int i;
};
class CSon:public CFather //定义了一个父类的子类
{
public:
int j;
};
int main(void)
{
CFather *p;//定义一个指向父类的一个指针
CSon jack;//定义一个子类的对象
p=&jack;//让指针指向这个子类的对象
p->y=3;{既然p指向了子类的这个对象,也就是说这个指针p可以代替jack这个对 象,为什麽不可以这样赋值:p->y=3?}
cout<<p->y;
return 0;
}
[解决办法]
y应该是j吧?不可以代替的,除非强转 ((CSon*)p)->j,才可以访问j
[解决办法]
理解一下静态类型(编译时类型)和动态类型(运行时类型)就明白了。动态类型针对于运行时的虚函数调用
struct A
{
int a;
int val();
};
struct B : public A
{
int b;
int fun();
};
A* pa = new B(); //p的静态类型为A*
pa->a;//OK
pa->val();//OK
pa->b; //NG,A中没有成员叫b
pa->whatever(); //NG,A中没有成员叫whatever