虚函数与派生类重载

虚函数很简单,之前转载了人家的一片不错的文章就是关于虚函数的

这里不讲虚函数的定义了

直接进入主题,就是重载。

如果基类声明了一个函数是虚函数,而且派生类并没有改变参数,只是把函数内容改变了,那么这个可以认为是“重写 “

派生类重载是什么呢,就是在派生类中仅仅保留基类的函数名,参数变了,或者返回类型也变了,如果不改变参数仅仅改变返回类型不是重载,这样也是错的。

如果重载了,你就不会得到基类对应的函数名的函数了,被隐藏了!

除非你使用基类作用域解析符号,要不你调用基类版本就是错误的!

看例子:


class   C0
{
public:
virtual void   Set1(int   i)
{
cout <<"C0:Set1   i=" <<i <<endl;
}
/****found*****/
virtual   void   Set2(int   i)
{
cout <<"C0:Set2   i=" <<i <<endl;
}
};


class   C1:public   C0
{
public:
int   Set1(string i)
{
cout <<"C1:Set1   i=" <<i <<endl;
return 9;
}


void   Set2(int   i)
{
cout <<"C1:Set2   i=" <<i <<endl;
    C0::Set2(i);

}
};


void   main()
{
C0   *p;
C1   obj2;

obj2.Set1(1);  //这里就出错了
obj2.Set2(2);
/*******found*****/
p   =   &obj2;

p-> Set1(3);
p-> Set2(4);

return;
}

上面指示的地方就出错了,因为派生类的重载直接隐藏了基类的函数,而且继承作用暂时失效,如果你要使用基类的方法就是这样:obj2.C0::Set1(1);  加上作用域解析符。

有人问:p-> Set1(3);这里为什么不出错啊,c1类里面没有这么个函数类型啊,很简单,虚拟函数只对基类里面定义了的才算,不能理解成基类里面一个定义了,其他的也变成了虚拟的了,这样是不对的。

这里就有一个建议,如果重载了基类的函数,最好是把基类的虚函数都重写在派生类里面一次,就不会隐藏基类的函数方法了

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值