读书人

关于父类和子类继承赋值有关问题

发布时间: 2013-04-02 12:35:26 作者: rapoo

关于父类和子类继承赋值问题
#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

[解决办法]
引用:
y应该是j吧?不可以代替的,除非强转 ((CSon*)p)->j,才可以访问j

这样强转是不是没意义啊,还不如直接定义一个CSon的指针
原因是编译器在编译时只检查类型,你CFather当然没有j的成员了,当然报错饿了

读书人网 >C++

热点推荐