父类指针可以指向子类指针,反之则不能

例如:class a{public:int aa};class b:public a{public: int bb;}从内存的来看如a---------||占一个int数据大小--||----(aa数据)------||---------而b则是---------|---------|占一个int数据大小--|占一个Int数据大小--||从a中继承而来------|---(bb数据----------||------------------当定义一个基类类型的指针时a *p;这时,这个指针指向的是a类型的数据当p指针指向派生类的时候,因为p是a类型的指针,所以*p只解释为a类型数据的长度,即————————-|---------|占一个int数据大小--|占一个Int数据大小--||从a中继承而来------|-----(bb数据)-------||------------------|------------|------------| |-p只指向这个区域_--|

因此,当基类的指针(P)指向派生类的时候,只能操作派生类中从基类中继承过来的数据。指向派生类的指针,因为内存空间比基类长,会导致严重了后果,所以不允许派生类的指针指向基类。而基类的指针可以指向派生类。

C++的多态性能解决基类指针不能操作派生类的数据成员的问题。
时间: 2024-10-11 20:53:59

父类指针可以指向子类指针,反之则不能的相关文章

父类的引用指向子类的对象或者接口指向实现类均是可以的

父类的引用指向子类的对象或者接口指向实现类均是可以的. 例如(下图为父类的引用指向子类的对象) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Father {         public void pri() {             System.out.println("father");         } } public class Sun   extends  Father{       public void 

父类的引用指向子类的对象

1.Father.java package com.ljb.extend; public class Father {  public int x = 10;  public int fGet() {   return x;  } } 2.Son.java package com.ljb.extend; public class Son extends Father {  // 不能出现与父类同名属性  public int a = 100;  public int fGet() {   Sys

父类的指针无法指向子类对象

父类的指针指向子类的对象,这一特性在c++中叫做多态. 当然,多态还可以有更深的解释. 可是,为什么有时候父类的指针指向不了子类的对象? 有如下两个文件的代码: //B.h class B : public A{}; //main.cpp    Class A; Class B;   void fun(B* b) {     A* a = b;  //这边有错       } 原因是这样子的,有时候我们为了提高编译速度, 会做一些前置声明,比如Class A 告诉编译器A存在. 而后我们可以 A

为什么父类指针可以指向子类反之则不行(内存长度不同)

例如: class a {public: int aa}; class b:public a {public: int bb; } 从内存的来看 如a ---------| |占一个int数据大小--| |----(aa数据)------| |--------- 而b则是 ---------|--------- |占一个int数据大小--|占一个Int数据大小--| |从a中继承而来------|---(bb数据----------| |------------------ 当定义一个基类类型的

为什么父类引用可以指向子类对象 子类引用不能指向父类对象 泛型

假设有父类Fu ,其子类为Zi ,从对象的内存角度,假设Fu类里面的变量占内存2M, Zi 类里的变量占内存1M: Fu f = new Fu ();//系统将分配2M内存 Zi z = new Zi ();//系统将分配3M内存(2+1) 因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.所以z可以调用父类的方法. Zi z1= z; //z1指向那3M的内存. Fu f1 = (Fu)z;//这时f1会指向那3M内存中

【转】父类子类指针相互转换问题

1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的: 2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的: 3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的. 将上面三句话总结成一句话就是:当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数: 当父类子类有同名虚函数的时候呢,调用的是指针转换前指

腾讯2011一道父类指针和子类指针转化的题目

class ClassA { public: virtual ~ClassA(){} virtual void FunctionA(){} }; class ClassB { public: virtual void FunctionB(){} }; class ClassC :public ClassA , public ClassB { }; 关于pA,pB,pC的取值,下面的描述中正确的是: A.pA,pB,pC的取值相同. B.pC=pA+pB C.pA,pB不相同 D.pC不等于pA也

父类子类指针相互转换问题

1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的: 2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的: 3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的: 将上面三句话总结成一句话就是:当父类子类有同名非虚函数的时候,调用的是指针自己类型的函数: 当父类子类有同名虚函数的时候呢,调用的是指针指向的对象类

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s