请问下面程序那个派生类中的函数 f4()是属于重载函数还是同名覆盖的?请给出具体解释,完成后加分
#include<iostream.h>//虚函数与重载函数的关系classbase{public:virtualvoidf1(){cout<<"f1functionof...
#include <iostream.h> //虚函数与重载函数的关系
class base
{
public:
virtual void f1()
{cout<<"f1 function of base"<<endl;}
virtual void f2()
{cout<<"f2 function of base"<<endl;}
virtual void f3()
{cout<<"f3 function of base"<<endl;}
void f4()
{cout<<"f4 function of base"<<endl;}
};
class derive:public base
{
void f1() // 仍为虚函数
{cout<<"f1 function of derive!"<<endl;}
void f2(int x) // 丢失虚特性,变为一般的重载函数
{cout<<"f2 function of derive"<<endl;}
// int f3() 错误,只有返回类型不同
// {cout<<"f3 function of derive"<<endl;}
void f4()
{cout<<"f4 function of derive"<<endl;}
};
void main()
{
base obj1,*ptr;
derive obj2;
ptr=&obj1;
ptr->f1();
ptr->f2();
ptr->f3();
ptr=&obj2;
ptr->f1();
ptr->f2();
ptr->f4();
} 展开
class base
{
public:
virtual void f1()
{cout<<"f1 function of base"<<endl;}
virtual void f2()
{cout<<"f2 function of base"<<endl;}
virtual void f3()
{cout<<"f3 function of base"<<endl;}
void f4()
{cout<<"f4 function of base"<<endl;}
};
class derive:public base
{
void f1() // 仍为虚函数
{cout<<"f1 function of derive!"<<endl;}
void f2(int x) // 丢失虚特性,变为一般的重载函数
{cout<<"f2 function of derive"<<endl;}
// int f3() 错误,只有返回类型不同
// {cout<<"f3 function of derive"<<endl;}
void f4()
{cout<<"f4 function of derive"<<endl;}
};
void main()
{
base obj1,*ptr;
derive obj2;
ptr=&obj1;
ptr->f1();
ptr->f2();
ptr->f3();
ptr=&obj2;
ptr->f1();
ptr->f2();
ptr->f4();
} 展开
4个回答
展开全部
重载的特征:在同一个类中;函数名字相同;参数不同;virtual 关键字可有可无。
重写(覆盖)特征:分别位于派生类与基类;函数名字相同;参数相同;基类函数必须有virtual 关键字(这点非常要注意)。
隐藏规则如下:
1、如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
2、 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与重写混淆)。
#include <iostream.h> //改为<iostream>
class base
{
public:
virtual void f1()
{cout<<"f1 function of base"<<endl;}
virtual void f2()
{cout<<"f2 function of base"<<endl;}
virtual void f3()
{cout<<"f3 function of base"<<endl;}
void f4()
{cout<<"f4 function of base"<<endl;}
};
class derive:public base
{
void f1() // 重写基类的f1,基类为virtual
{cout<<"f1 function of derive!"<<endl;}
void f2(int x) // 这不是重写,是隐藏了基类的f2
{cout<<"f2 function of derive"<<endl;}
int f3() //错误,返回值不同不能用来重写,可以在后面加上const进行重写
{cout<<"f3 function of derive"<<endl;}
void f4()//隐藏了基类的f4
{cout<<"f4 function of derive"<<endl;}
};
void main()
{
base obj1,*ptr;//ptr的静态类型为base
derive obj2;
ptr=&obj1;//ptr的静态和动态类型都是base
ptr->f1();//调用obj1的f1(),静态绑定
ptr->f2();//调用obj1的f2(),静态绑定
ptr->f3();//调用obj1的f3(),静态绑定
ptr=&obj2;//ptr的动态类型为derive,静态类型为base
ptr->f1();//调用obj2的f1(),动态绑定,虚函数才会动态绑定
ptr->f2();//调用obj1的f2(),静态绑定
ptr->f4();//调用obj1的f4(),静态绑定
}
重写(覆盖)特征:分别位于派生类与基类;函数名字相同;参数相同;基类函数必须有virtual 关键字(这点非常要注意)。
隐藏规则如下:
1、如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
2、 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与重写混淆)。
#include <iostream.h> //改为<iostream>
class base
{
public:
virtual void f1()
{cout<<"f1 function of base"<<endl;}
virtual void f2()
{cout<<"f2 function of base"<<endl;}
virtual void f3()
{cout<<"f3 function of base"<<endl;}
void f4()
{cout<<"f4 function of base"<<endl;}
};
class derive:public base
{
void f1() // 重写基类的f1,基类为virtual
{cout<<"f1 function of derive!"<<endl;}
void f2(int x) // 这不是重写,是隐藏了基类的f2
{cout<<"f2 function of derive"<<endl;}
int f3() //错误,返回值不同不能用来重写,可以在后面加上const进行重写
{cout<<"f3 function of derive"<<endl;}
void f4()//隐藏了基类的f4
{cout<<"f4 function of derive"<<endl;}
};
void main()
{
base obj1,*ptr;//ptr的静态类型为base
derive obj2;
ptr=&obj1;//ptr的静态和动态类型都是base
ptr->f1();//调用obj1的f1(),静态绑定
ptr->f2();//调用obj1的f2(),静态绑定
ptr->f3();//调用obj1的f3(),静态绑定
ptr=&obj2;//ptr的动态类型为derive,静态类型为base
ptr->f1();//调用obj2的f1(),动态绑定,虚函数才会动态绑定
ptr->f2();//调用obj1的f2(),静态绑定
ptr->f4();//调用obj1的f4(),静态绑定
}
展开全部
重载是在同一可访问区内被声名的几个具有不同参数列的(参数的类型、个数、顺序不同)同名函数,程序会根据不同的参数列来确定具体调用哪个函数,这种机制叫重载,重载不关心函数的返回值类型。
覆盖是指派生类中存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本,这种机制就叫做覆盖。
所以你那个f4,参数相同(无),返回值相同void,属于覆盖。
覆盖是指派生类中存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本,这种机制就叫做覆盖。
所以你那个f4,参数相同(无),返回值相同void,属于覆盖。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
回复:属于重载函数
证明:在main函数内,插入一段代码:
derive a;
a.f4();
得到的结果是:f4 function of derive
而不是:f4 function of base
那么就可以知道,函数已经被覆盖
而且,在base类中,f4()函数并没有申请为虚函数,
根据这一点都可以判断,f4()函数被覆盖。
证明:在main函数内,插入一段代码:
derive a;
a.f4();
得到的结果是:f4 function of derive
而不是:f4 function of base
那么就可以知道,函数已经被覆盖
而且,在base类中,f4()函数并没有申请为虚函数,
根据这一点都可以判断,f4()函数被覆盖。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
隐藏、静态绑定交错起作用:
1、可以轻易忽略重载了,因为重载发生在同一作用域的同名不同参的函数之间。
2、重写/覆盖、多态针对的是虚函数、virtual基类,所以f4肯定不是。
3、按照隐藏的原则,如果使用对象实例obj2.f4(),则调用的肯定是派生类的f4函数。
4、但由于是使用指针的方式调用,编译器对非虚函数f4使用了静态绑定,所以调用了基类的f4函数。
比较复杂,实际应用的时候尽量避免才是上策,除非必须。
1、可以轻易忽略重载了,因为重载发生在同一作用域的同名不同参的函数之间。
2、重写/覆盖、多态针对的是虚函数、virtual基类,所以f4肯定不是。
3、按照隐藏的原则,如果使用对象实例obj2.f4(),则调用的肯定是派生类的f4函数。
4、但由于是使用指针的方式调用,编译器对非虚函数f4使用了静态绑定,所以调用了基类的f4函数。
比较复杂,实际应用的时候尽量避免才是上策,除非必须。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询