发布网友 发布时间:2022-03-18 00:38
共3个回答
热心网友 时间:2022-03-18 02:07
首先,简单说明一下有关虚函数的语法知识,如下:
第一:所谓虚函数,就是前面加了virtual的函数。(记住:只要加了virtual的,肯定是虚拟函数;前面没有加virtual的,有些是,有些不是,详细解释看下面);
第二:虚函数是C++实现多态机制的体现;并且要让虚函数起作用,必须有类继承体系,其中派生类override(重写)虚函数实现体;
第三:在一个类继承体现中,如果一个函数Fun前面加了virtual,并且第一次出现在一个类A中,那么这个函数肯定是虚函数,如果这个类A的派生类(不管是第几层派生)中,出现这个相同名字的Fun函数,不管这个函数前面有没有virtual,这个函数都是虚函数,并且称为“这个类override了虚拟函数Fun”。
简言之,虚拟函数是在继承体系中的某一个类中,第一次在声明时,函数前面出现virtual的那个函数。这个类之上的基类中具有相同名字但前面没有virtual的函数不是虚拟函数,而这个类之下的派生类中的相同名字的函数(不管前面有没有virtual)都是对这个虚函数的override。
理解一个虚函数,应该在一个继承体系中去理解,不能地说这个虚函数归属于哪一个具体的类。而应该理解为:这个虚函数在哪个类中第一次被声明为虚函数,哪些派生类override了这个虚函数。
如果想深入理解虚函数,以及虚函数如何起作用,需要知道“virtual table”。(你网上查吧)
下面回答你列举的问题。
1。肯定不是虚函数了。基类和派生类中具有相同的声明式的函数,前面没有virtual,这叫overwrite(覆盖)。注意分清overwrite和override的区别。(网上搜索一下,很多解释)
2。对,基类中加了virtual,派生类中的相同声明式的函数(不管前面有没有virtual)也会被说明为虚拟函数。
3。若派生类中有virtual,而基类中没有,基类中的不是虚函数,派生类中的肯定是;
4。这个类继承体系中,没有多态。所以都是overwrite的问题。
C c;
B d;
c.func(); // 调用C中的
c.B::func();// 调用B中的
c.A::func();// 调用A中的
A&a=d;
a.func(); // 调用A中的,虽然使用了&引用,因为不是虚拟函数,不会调用B中的
B&b=c;
b.func(); // B的
b.B::func(); // B的
简单言之,就是看调用中,这个对象是哪个类就调用哪个类中的函数。如果你明确指定哪个基类,就调用你指定的那个。
因为这里面没有多态(也就是没有virtual),只根据对象所属哪个类来调用。
5。在a类的func()前加virtual时b,c类是虚涵数
6。在b类的func()前加virtual时a中的不是虚函数,c类中的是虚涵数;
7。在c类的func()前加virtual时a,b类都不是虚涵数
热心网友 时间:2022-03-18 03:25
1.不是的
2.是覆盖
3.不
in c
in b
in a
in b
in c
in c
5。在b里面是,c不是!
6.a里面不是,c里面是!
7.都不是
热心网友 时间:2022-03-18 05:00
1、不是;
2、是;
3、不是;
4、结果是:
int c
int b
int a
int a
int b
int b
5、是
6、不是
7、不是