C++,分析运行结果

帮忙分析下运行结果#include<iostream.h>classA{public:virtualvoiddisplay(){cout<<"A::display()"<... 帮忙分析下运行结果

#include <iostream.h>
class A
{
public:
virtual void display()
{
cout<<"A::display()"<<endl;
}
};
class B:public A
{
public:
void display()
{
cout<<"B::display()"<<endl;
}
};
class C:public B
{
public:
void display()
{
cout<<"C::display()"<<endl;
}
};
void function(A *ptr)
{
ptr->display();
}
void main()
{
A a,*pointer;
B b;
C c;
pointer=& b;
function(pointer);
pointer=& c;
function(pointer);
}
展开
 我来答
GO_WITH_SHE
2013-10-28 · TA获得超过118个赞
知道小有建树答主
回答量:70
采纳率:0%
帮助的人:93万
展开全部
B::display()
C::display()

分析:A是B的基类,B是C的基类,而display是基类A定义的虚函数。
在使用基类的指针A*作为参数传递给函数function,ptr->display();中的display是动态绑定的。
将调用实参类型定义的display函数(子类B、C类均重写了此函数)。
追问
能不能从计算机的运行角度
写下,一步一步,怎么得到结果的
追答

这一特性叫做多态,是C++的最基础的知识之一。

 

在 C++ 中,通过基类的引用(或指针)调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。用引用(或指针)调用的虚函数在运行时确定,被调用的函数是引用(或指针)所指对象的实际类型所定义的。

 

拿你的例子来讲,你可以使用基类的指针或引用来绑定到派生类的对象上(并不改变派生类本身),在程序运行时,将根据你指向或引用的实际类型来判定选择的虚函数。

基类指针point 可以指向基类A,也可以指向派生类B或C,这并不改变指向的派生类本身。

而是程序中调用虚函数时,使用的是动态绑定,根据指向的对象本身的类型而定。

        A a,*pointer;
B b;
C c;
pointer=& b;//指向B类型对象,而B改写了function函数
function(pointer);//动态绑定到B::function函数
pointer=& c;//指向C类型对象,而C改写了function函数
function(pointer); //动态绑定到C::function函数

 

以下是我在一本书看到的,描述的不一定对:C++这一具体技术的实现上,一般是在类中隐含一个函数指针数组,用来保存对应的虚函数的地址,在基类中,这一指针指向基类的虚函数本身,而在派生类中,这一指针保存的是派生类重定义的虚函数的入口地址。

lightmei001
2013-10-28 · 超过15用户采纳过TA的回答
知道答主
回答量:49
采纳率:100%
帮助的人:37.8万
展开全部
C继承B,B继承A
一开始函数指针指向B, 输出B::display()
之后指向C, 输出C::display()
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式