C++多态问题,跪求高手解答

#include<iostream>usingnamespacestd;classA{public:virtualvoidprint(){cout<<'a'<<endl;... #include<iostream>
using namespace std;
class A
{
public:
virtual void print()
{
cout<<'a'<<endl;
}
};
class B:public A
{
public:
void print()
{
cout<<'b'<<endl;
}
};
int main()
{
A a;
B b;
A *p1=&a,*p2=&b;
p1->print();
p2->print();
return 0;
}
我有两个问题不明白,请高手不吝赐教!
1.指针p2的类型是A,而b的类型是B,尽管B继承A,但是毕竟A与B的类型不一样,p2怎么能保存B的地址?这就好像int型指针保存char型地址。
2.多态的机制。为什么我设置为虚函数之后,p2调用了类B的函数?而不设置虚函数却调用类A的函数?
还望高手详细解答,鄙人感激不尽!
展开
 我来答
oskk
2010-08-20 · 超过21用户采纳过TA的回答
知道答主
回答量:50
采纳率:0%
帮助的人:44.2万
展开全部
1.本来基类指针是用来指向基类对象的,如果用它指向派生类对象,则进行指针类转换,将派生类对象的指针先转换为基类的指针,基类指针指向的是派生类对象中的基类部分。如果不声明print()为虚函数则p2只能调用B中继承的类A的函数。
将print()声明为虚函数之间后,在派生类的基类部分中派生类的虚函数取代了基类原来的虚函数,因此在使基类指针指向派生类对象之后,调用虚函数时就调用了派生类的虚函数,所以p2就调用了类B的函数。
p2指向B的地址是通过指针类转换实现的,这也是C++的的特点,其实编程语言本来就是人为设计的,是为了方便人们使用,语法就只是一种规而已,所以不用太钻牛角尖,只用掌握其规则就可以了。
guopei296
2010-08-20 · TA获得超过1075个赞
知道小有建树答主
回答量:223
采纳率:0%
帮助的人:196万
展开全部
1、首先,在C++里面,指针占用内存的大小事一样的,所以任何一个指针,只要进行强制类型转换,都可以指向其它类型。另外,A是父类,B是子类,比方说,A代表人,B代表美国人,那么一个名字如果是用来指人的(比如你的p2),那么它就可以用来指一个美国人,然而如果一个名字是用来指美国人的,那么就不能用它随意指向其它国家的人。

2、虚函数的主要作用就是用在多态机制中的。当设置虚函数时,p2调用它实际指向的对象(b)的类型(B)的函数,不用虚函数时,p2调用它所声明的类型(A)的函数

你的问题问的很好,学习程序设计就是要仔细思考,把它们弄明白
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jhb86253817
2010-08-20 · 超过15用户采纳过TA的回答
知道答主
回答量:84
采纳率:0%
帮助的人:53.3万
展开全部
这位同学,既然你在学C++,那应该有C++的书吧,书上讲得挺明白的,如果没有,最好借一本或买一本,以后你还会遇到很多问题,总不能老是百度吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
珊卣最迟竞c81d3
2010-08-20 · 超过12用户采纳过TA的回答
知道答主
回答量:47
采纳率:0%
帮助的人:30.3万
展开全部
三楼分析的挺细致,最近刚为这一块疑惑
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式