c++ 父类指针转换为子类指针后调用子类的成员函数,为什么可以调用成功?
代码如下:#include<iostream>usingnamespacestd;classA{public:voiddisplay(){cout<<"Aclass"<<...
代码如下:
#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类对象的,为什么只是转换了指针类型之后就可以调用成功呢?
请大神帮忙解释一下。 展开
#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类对象的,为什么只是转换了指针类型之后就可以调用成功呢?
请大神帮忙解释一下。 展开
5个回答
展开全部
父类指针指向子类对象,然后调用子类对象所继承(或改写)的父类方法,这就是面向对象的核心--多态
其实也好理解,子类对象的类型与其父类的类型是共通的,他就是从父类继承来的,如果把子类比父类新增的成员变量或成员函数去掉,他就是一个父类的对象,当然可以调用自己的方法
不过,一般多态不是楼主这么用的,\一般是用来参数传递上,比如一个方法,要对他传的的参数是一个父类的类型的对象,然后这个方法中调用这个父类的成员函数,而实际传进去的实参通常为子类对象,方法调用的是子类改写后的方法
其实也好理解,子类对象的类型与其父类的类型是共通的,他就是从父类继承来的,如果把子类比父类新增的成员变量或成员函数去掉,他就是一个父类的对象,当然可以调用自己的方法
不过,一般多态不是楼主这么用的,\一般是用来参数传递上,比如一个方法,要对他传的的参数是一个父类的类型的对象,然后这个方法中调用这个父类的成员函数,而实际传进去的实参通常为子类对象,方法调用的是子类改写后的方法
展开全部
这个无错。
因为,你调用的是B的displayB,这个,在类声明时就创建,且,这函数不涉及到什么成员,所以,在你将A对象转换成B对象且调displayB时,不会报错。毕竟,系统,只是当了A对象在地址以B对象的形式去处理而已。
建议,你看看,类继承那一块,最好是,那本c++ primer中的关于类及类继承中关于创建过程那一节。特别是空间分配。
因为,你调用的是B的displayB,这个,在类声明时就创建,且,这函数不涉及到什么成员,所以,在你将A对象转换成B对象且调displayB时,不会报错。毕竟,系统,只是当了A对象在地址以B对象的形式去处理而已。
建议,你看看,类继承那一块,最好是,那本c++ primer中的关于类及类继承中关于创建过程那一节。特别是空间分配。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int main()
{
int a ; // 是int哦
((B*)&a)->displayB() ;
return 0 ;
}
LZ 试试这个代码就可以知道了. 同样可以执行成功.
只是因为你的B::displayB函数太简单了, 没有使用任何的类成员.
若是class B里面定义一个 成员x, 然后displayB输出这个x, 那么强制转换之后才会出现错误.
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
额,没有看懂你写的程序。
按照我自己猜测的想法解释解释,如果不是这个问题,请滤过。
指针的作用:
1.存储一个地址
2.根据类型确定指向范围的大小
3.确定能调用的成员函数(这里先不说虚函数)
父类指针里面存了子类的地址,但是能访问的空间只有父类的空间,能调用的函数只有父类的成员函数,和根据虚指针访问到的虚函数。
通过static_cast<>转成子类类型的指针后,我们就可以访问子类里面新定义的成员变量和新定义的成员函数了。
按照我自己猜测的想法解释解释,如果不是这个问题,请滤过。
指针的作用:
1.存储一个地址
2.根据类型确定指向范围的大小
3.确定能调用的成员函数(这里先不说虚函数)
父类指针里面存了子类的地址,但是能访问的空间只有父类的空间,能调用的函数只有父类的成员函数,和根据虚指针访问到的虚函数。
通过static_cast<>转成子类类型的指针后,我们就可以访问子类里面新定义的成员变量和新定义的成员函数了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询