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);
} 展开
#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);
} 展开
展开全部
B::display()
C::display()
分析:A是B的基类,B是C的基类,而display是基类A定义的虚函数。
在使用基类的指针A*作为参数传递给函数function,ptr->display();中的display是动态绑定的。
将调用实参类型定义的display函数(子类B、C类均重写了此函数)。
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++这一具体技术的实现上,一般是在类中隐含一个函数指针数组,用来保存对应的虚函数的地址,在基类中,这一指针指向基类的虚函数本身,而在派生类中,这一指针保存的是派生类重定义的虚函数的入口地址。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询