c++ 父类指针转换为子类指针后调用子类的成员函数,为什么可以调用成功?

代码如下:
#include <iostream>
using namespacestd ;
class A{
public:
void display(){cout << "A class" << endl ;}
} ;
class B:public A{
public:
void displayB(){cout << "B class" << endl ;}
} ;
int main(){
A a ;
((B*)&a)->displayB() ;
return 0 ;
}

屏幕输出B class
照理说,只是进行了指针的转换,内存中并不是真实存在B类对象的,为什么只是转换了指针类型之后就可以调用成功呢?
请大神帮忙解释一下。

父类指针指向子类对象,然后调用子类对象所继承(或改写)的父类方法,这就是面向对象的核心--多态
其实也好理解,子类对象的类型与其父类的类型是共通的,他就是从父类继承来的,如果把子类比父类新增的成员变量或成员函数去掉,他就是一个父类的对象,当然可以调用自己的方法
不过,一般多态不是楼主这么用的,\一般是用来参数传递上,比如一个方法,要对他传的的参数是一个父类的类型的对象,然后这个方法中调用这个父类的成员函数,而实际传进去的实参通常为子类对象,方法调用的是子类改写后的方法
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-17
这个无错。
因为,你调用的是B的displayB,这个,在类声明时就创建,且,这函数不涉及到什么成员,所以,在你将A对象转换成B对象且调displayB时,不会报错。毕竟,系统,只是当了A对象在地址以B对象的形式去处理而已。
建议,你看看,类继承那一块,最好是,那本c++ primer中的关于类及类继承中关于创建过程那一节。特别是空间分配。
第2个回答  推荐于2017-09-17
int main()
{
int a ; // 是int哦
((B*)&a)->displayB() ;
return 0 ;
}

 

 LZ 试试这个代码就可以知道了. 同样可以执行成功.

只是因为你的B::displayB函数太简单了, 没有使用任何的类成员.

若是class B里面定义一个 成员x, 然后displayB输出这个x, 那么强制转换之后才会出现错误.



本回答被提问者采纳
第3个回答  推荐于2017-09-25

1、当父类中声明某个函数为虚函数,并且子类得载了这个虚函数以后,用父类对象的指针可以调用子类的相应函数,但前提是该指针指向的对象是子类的对象,否则没有意义。

2、例程:

#include <iostream>
using namespace std;
class A
{
public:
 void print()
 { cout << "this line is from A" << endl; }
};
class B : public A
{
public:
  void print()
 { cout << "this line is from B" << endl; }
};
void main()
{
 A *p = new A;
 ((B*)p)->print();
 delete p;
}

第4个回答  2019-09-17
额,没有看懂你写的程序。
按照我自己猜测的想法解释解释,如果不是这个问题,请滤过。
指针的作用:
1.存储一个地址
2.根据类型确定指向范围的大小
3.确定能调用的成员函数(这里先不说虚函数)

父类指针里面存了子类的地址,但是能访问的空间只有父类的空间,能调用的函数只有父类的成员函数,和根据虚指针访问到的虚函数。
通过static_cast<>转成子类类型的指针后,我们就可以访问子类里面新定义的成员变量和新定义的成员函数了。
相似回答