看流星社区

 找回密码
 注册账号
查看: 2147|回复: 0

c++虚函数与派生类重载

[复制链接]

该用户从未签到

发表于 2013-2-11 18:50:36 | 显示全部楼层 |阅读模式
如果基类声明了一个函数是虚函数,而且派生类并没有改变参数,只是把函数内容改变了,那么这个可以认为是“重写 “

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

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

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

看例子:


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类里面没有这么个函数类型啊,很简单,虚拟函数只对基类里面定义了的才算,不能理解成基类里面一个定义了,其他的也变成了虚拟的了,这样是不对的。

这里就有一个建议,如果重载了基类的函数,最好是把基类的虚函数都重写在派生类里面一次,就不会隐藏基类的函数方法了。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-4 09:46

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表