虚函数的使用

#include <iostream>

using namespace std;
class A
{
public:
int b;
//virtual int b; //错误,不能把成员变量声明为虚有的
virtual void f()
{
cout<<"继续"<<endl;
}
virtual void h(int i=1,int j=2)
{
cout<<"继续H"<<endl;
}
~A(){
cout<<"析构A"<<endl;
}
};
class B:public A
{
public:
int b;
void f(int i)//重载虚函数f
{
cout<<"paif()"<<endl;
}
void f(){//在派生类中重定义虚函数f
cout<<"paixu"<<endl;
}
void h(){ //重载虚函数h的版本。注意这里不是对基类虚函数的重定义。
int b;
b=5;
cout<<"B的"<<b<<endl;
}
void h(int i,int j=3){
int b;
b=j;
cout<<"paixuH"<<b<<endl;
}//当基类中的虚函数有默认形参时,派生类中重定义基类中的虚函数的版本必须有相同数量的形参,
//形参可以有默认值,也可以没有。如果形参数量不一样多则是对虚函数的重载。
~B(){
cout<<"析构B"<<endl;
}
};
int main(){
B m;
A *p=&m;
//p->b=3/错误,指向派生类的基类指针不能调用派生类中的成员,只能调用基类中的成员,
//除非该成员是虚函数
p->f();W//调用派生类中的函数f

//p->f(4);错误,注意这里不是在调用派生类中带一个形参的f函数,因为带一个参数的f函数不是虚函数,

//用指向派生类的基类指针时不会调用派生类中的函数,除非这个函数是虚函数。这里基类中没有定义这种 //带一个形参的f函数,所以这时会出现错误。

p->A::f(); W//调用基类的虚函数f,可以用作用域运算符使用指向派生类的基类指针调用基类的虚函数

p->h();//调用派生类中的虚函数版本h,用指向派生类的基类指针调用虚函数时派生类中的虚函数的默认值在这里不起作用。虽然派生类中的虚函数需要一个参数,

//但这里不给参数仍是调用的派生类的带两个参数的虚函数h,而不是调用派生类中的不带参数的h函数

m.h(); //调用派生类中不带参数的h函数,如果要用对象调用派生类中带两个形参的h函数,在本例中必须使用一个实参值。
m.h(1);//调用派生类中带两个形参的h函数,用对象调用派生类中的虚函数时函数的默认值不受基类虚函数默认值的影响
m.A::h(1);// 调用基类中的虚函数h.
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值