首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-04-02 
关于父类和子类继承赋值问题#include iostreamusing namespace stdclass CFather //定义了一个父类{pub

关于父类和子类继承赋值问题
#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的成员了,当然报错饿了

热点排行