如果一个基类A的成员函数a()已经被定义为虚函数,那么它的派生类 虚函数B中有一个同名成员函数a()。如果

基类派生类同名函数&虚函数的用法
由虚函数实现的动态多态性就是: 同一类族中不同类的对象,对同一函数调用作出不同的响应。虚函数的使用方法是:
在基类用virtual声明成员函数为虚函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。
在类外定义虚函数时,不必再加virtual。
在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。
C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此在派生类重新声明该虚函数时,可以加virtual,也可以不加,但习惯上一般在每一层声明该函数时都加virtual,使程序更加清晰。
如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。
(3) 定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。
(4) 通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。
通过虚函数与指向基类对象的指针变量的配合使用,就能方便地调用同一类族中不同类的同名函数,只要先用基类指针指向即可。如果指针不断地指向同一类族中不同类的对象,就能不断地调用这些对象中的同名函数。这就如同前面说的,不断地告诉出租车司机要去的目的地,然后司机把你送到你要去的地方。
需要说明;有时在基类中定义的非虚函数会在派生类中被重新定义,如果用基类指针调用该成员函数,则系统会调用对象中基类部分的成员函数;如果用派生类指针调用该成员函数,则系统会调用派生类对象中的成员函数,这并不是多态性行为(使用的是不同类型的指针),没有用到虚函数的功能。
以前介绍的函数重载处理的是同一层次上的同名函数问题,而虚函数处理的是不同派生层次上的同名函数问题,前者是横向重载,后者可以理解为纵向重载。但与重载不同的是:
同一类族的虚函数的首部是相同的,而函数重载时函数的首部是不同的(参数个数或类型不同)。
比如说你有一个基类BASE,有一个派生类Derived继承自BASE
两个类都有一个叫做fun的方法
然后你创建一个子类对象,但是用父类的指针(或者引用)指向他
BASE *b = new Derived();
如果你不加virtual
那么b.fun()调用的是父类的fun。因为b是父类指针,只能调用父类的方法,调用不到子类的方法。
如果你加上virtual
那么b.fun()调用的是子类的fun。因为加了virtual之后,会产生一个虚表,将fun函数放入虚表之内。当创建一个子类对象时,会自动“覆盖”父类的fun函数(你暂时这么理解就行)。b.fun()调用的是子类覆盖之后的fun函数。
也就是说,不加virtual,你的子类对象会有两个fun函数,一个父类的,一个子类的。
如果你加上virtual,你的子类只有一个fun函数,就是父类的fun函数。
简单说一下多态的作用吧。
比如说ATM,你要插借记卡,信用卡,VISA之类的,各种各样的银行卡。这些卡都是银行卡,所以银行卡是父类。而各种各样的卡是子类。
当ATM要取钱的时候,他不需要为每一种卡都写一个函数&&&&&&&
借记卡.getMoney(),信用卡.getMoney()。
有了多态之后,他只需要写一个
银行卡的getMoney()函数就行了,将这个函数设置为virtual。多态的意义就是能够用父类指针来指向子类对象。而不同种类的卡(子类)只需要实现自己的getMoney().当使用银行卡调用getMoney函数时,程序会因为多态性,自动寻找子类的getMoney函数执行。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。A为基类,virtual A* f(A&)是其成员函数。B为A的派生类,则B类中的______成员函数仍然是虚函数。_百度知道
A为基类,virtual A* f(A&)是其成员函数。B为A的派生类,则B类中的______成员函数仍然是虚函数。
virtual A* f(A&)是其成员函数,则B类中的______成员函数仍然是虚函数。B为A的派生类1. A为基类
提问者采纳
A已经经历了一次初始化了第一个调用A的默认拷贝函数,在此之前,把B赋值给A,第二个是赋值
提问者评价
知道智能回答机器人
我是知道站内的人工智能,可高效智能地为您解答问题。很高兴为您服务。
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁以下试题来自:
单项选择题下面关于虚函数的描述,错误的是A.在成员函数声明的前面加上virtual修饰,就可把该函数声明为虚函数B.基类中说明了虚函数后,派生类中对应的函数也必须说明为虚函数C.虚函数可以是另一个类的友元函数,但不能是静态成员函数D.基类中说明的纯虚函数在其任何派生类中都必须实现
为您推荐的考试题库
你可能感兴趣的试题
1A.私有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.公有继承的公有成员2A.0B.10C.15D.163A.12 12B.12 21C.21 12D.21 214A.④B.⑤C.⑥D.⑦5A.abcB.acbC.cabD.cba
热门相关试卷
最新相关试卷今天去参加百度的面试,遇到一个关于虚函数的机制的问题,我一直认为就是为了让基类指针或引用(指向继承类)能够看到基类的虚函数(当基类的虚函数没有被继承类重写),但是继承类又怎么看到基类的普通成员函数呢?我开始想,好想不可以调用基类的成员函数,因为基类的成员函数不是虚函数,在虚表找不到它,好吧,明天被鄙视了。回到家好好的研究了一下虚函数和成员函数,看看基类的成员函数和虚函数在派生类指针或引用是否可见,还有基类的成员函数和虚函数在基类指针或引用(指向继承类)是否可见,以及派生类的成员函数和虚函数在基类指针或引用(指向继承类)是否可见?
下面是例子:
#include &iostream&class A{public:&& &A(int i) { n=i; }&& &A(){ n=1;}&& &virtual void f(){ std::cout&&"A.f() is used"&&}&& &void g(){ std::cout&&"A.g() is used"&&}&& &void k(){ std::cout&&"A.k() is used"&&}private:&& &};class B:public A{public:&& &B(int i) { n=i; }&& &B(){ n=1;}&& &void f(){ std::cout&&"B.f() is used"&&}&& &void g(){ std::cout&&"B.g() is used"&&}&& &void h(){ std::cout&&"B.h() is used"&&}&& &virtual void j(){ std::cout&&"B.h() is used"&&}private:&& &};class C{public:&& &C(int i) { n=i; }&& &C(){ n=1;}&& &void w(){ std::cout&&"C.w() is used"&&}private:&& &};int main(){&& &B&& &b.k();&& //b显然能看到A中的k()&& &A *a;&& &a=&b;&& &a-&f(); //a看到的是B的f()&& &a-&A::f();& //a看到的是A的f()&& &a-&g();& //a看到的是A的g()&& &a-&h();& //a看不到B的h()&& &a-&j();& //a看不到B的虚拟函数j()&& &cout&&a-&C::n&&& //看不到&& &a-&C::w();& //看不到&& &while(1)&& &{&& &}}
一个类的对象中是没有关于普通成员函数的指针的slot,只有成员变量还有虚表指针,类的成员函数的代码定义在PE文件的代码区,所以从程序加载时,就已经分配好了内存用于存放这些代码;代码运行时所需要的内存,比如栈、堆等等,则是代码运行时才分配的;对于某个类的所有对象来说,类成员函数只在内存中有一份拷贝,所有的对象都共享同一份成员函数的代码。同一个类的不同的对象之间的差异仅仅是通过成员变量来体现的。c++实现成员函数的时候实际上用到了一个技巧&&this指针。this指针是当前调用成员函数的对象首地址,我们知道通过这个地址可以访问到对应对象的成员变量。那么成员函数如何区分this究竟指向哪个对象呢?技巧就在于,c++背后把成员函数当做普通函数一样调用,除了传入实际的参数外,还把所属对象的指针作为参数this传入,函数内部通过显示的或者隐含的方式访问对象成员。当然,这只是背后的事情,外面用起来就和你见到的一样,简单直观。
http://blog.csdn.net/haoel/article/details/1948051
阅读(...) 评论()

我要回帖

更多关于 基类的指针指向派生类 的文章

 

随机推荐