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

2024-12-05 03:00:52
推荐回答(5个)
回答1:

父类指针指向子类对象,然后调用子类对象所继承(或改写)的父类方法,这就是面向对象的核心--多态
其实也好理解,子类对象的类型与其父类的类型是共通的,他就是从父类继承来的,如果把子类比父类新增的成员变量或成员函数去掉,他就是一个父类的对象,当然可以调用自己的方法
不过,一般多态不是楼主这么用的,\一般是用来参数传递上,比如一个方法,要对他传的的参数是一个父类的类型的对象,然后这个方法中调用这个父类的成员函数,而实际传进去的实参通常为子类对象,方法调用的是子类改写后的方法

回答2:

这个无错。
因为,你调用的是B的displayB,这个,在类声明时就创建,且,这函数不涉及到什么成员,所以,在你将A对象转换成B对象且调displayB时,不会报错。毕竟,系统,只是当了A对象在地址以B对象的形式去处理而已。
建议,你看看,类继承那一块,最好是,那本c++ primer中的关于类及类继承中关于创建过程那一节。特别是空间分配。

回答3:

int main()
{
int a ; // 是int哦
((B*)&a)->displayB() ;
return 0 ;
}
 

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

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

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



回答4:

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

2、例程:

#include 
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;
}

回答5:

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

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