c++虚函数的说明
两个类中都有一个相同的涵数func()(包括返回类型,参数类型,个数)前并未加virtual1,问他们是不是虚涵数?如是,是基类的还是派生类的?2,若基类涵数加virtu...
两个类中都有一个相同的涵数func()(包括返回类型,参数类型,个数)前并未加virtual
1,问他们是不是虚涵数?如是,是基类的还是派生类的?
2,若基类涵数加virtual,则派生类的相同涵数是否被说明了虚涵数?
3,若派生类涵数加virtual,则基类的相同涵数是否被说明了虚涵数?
4,分析以下类子的输出情况
#include<iostream.h>
class A
{
public:
void func(){cout<<"in a"<<endl;}
};
class B:public A
{
public:
void func(){cout<<"in b"<<endl;}
};
class C:public B
{
public:
void func(){cout<<"in c"<<endl;}
};
void main()
{
C c;
B d;
c.func();
c.B::func();
c.A::func();
A&a=d;
a.func();
B&b=c;
b.func();
b.B::func();
}
5,并说明在a类的func()前加virtual时b,c类是否是虚涵数?
6,并说明在b类的func()前加virtual时a,c类是否是虚涵数?
7,并说明在c类的func()前加virtual时a,b类是否是虚涵数?
高手详细解释一下,谢谢 展开
1,问他们是不是虚涵数?如是,是基类的还是派生类的?
2,若基类涵数加virtual,则派生类的相同涵数是否被说明了虚涵数?
3,若派生类涵数加virtual,则基类的相同涵数是否被说明了虚涵数?
4,分析以下类子的输出情况
#include<iostream.h>
class A
{
public:
void func(){cout<<"in a"<<endl;}
};
class B:public A
{
public:
void func(){cout<<"in b"<<endl;}
};
class C:public B
{
public:
void func(){cout<<"in c"<<endl;}
};
void main()
{
C c;
B d;
c.func();
c.B::func();
c.A::func();
A&a=d;
a.func();
B&b=c;
b.func();
b.B::func();
}
5,并说明在a类的func()前加virtual时b,c类是否是虚涵数?
6,并说明在b类的func()前加virtual时a,c类是否是虚涵数?
7,并说明在c类的func()前加virtual时a,b类是否是虚涵数?
高手详细解释一下,谢谢 展开
3个回答
展开全部
首先,简单说明一下有关虚函数的语法知识,如下:
第一:所谓虚函数,就是前面加了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类都不是虚涵数
第一:所谓虚函数,就是前面加了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类都不是虚涵数
展开全部
1.不是的
2.是覆盖
3.不
in c
in b
in a
in b
in c
in c
5。在b里面是,c不是!
6.a里面不是,c里面是!
7.都不是
2.是覆盖
3.不
in c
in b
in a
in b
in c
in c
5。在b里面是,c不是!
6.a里面不是,c里面是!
7.都不是
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、不是;
2、是;
3、不是;
4、结果是:
int c
int b
int a
int a
int b
int b
5、是
6、不是
7、不是
2、是;
3、不是;
4、结果是:
int c
int b
int a
int a
int b
int b
5、是
6、不是
7、不是
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |