当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

<b>如安在派生类中的躲藏基类的虚拟重载函数</b>[VC/C++编程]

赞助商链接



  本文“<b>如安在派生类中的躲藏基类的虚拟重载函数</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

我成立了一个类,基类中有虚拟重载函数.我想在派生类中改写基类中的虚拟重载函数.代码以下:

#include <iostream.h>
class B {
private:
  int nNumber;
public:
  virtual void test() {
    cout << "B::test()
"; }
  virtual void test(int x) {
    nNumber = x; // 将传入的参数赋值给私有成员
    cout << "B::test(int x)
"; 
  }
};
class D : public B {
public:
//test(void) 躲藏 B::test(int)
  virtual void test() {
    cout << "D::test()
";
  }
};
void main(int argc, char* argv[])
{
 D d;     // 派生类的实例
 d.test();    // OK
 d.test(17);   // 产生编译错误的代码行
}

基类中有两个重载的test函数.当我在派生类中改写此中的一个函数时,我认为别的一个应当在派生类中担当,但编译时呈现一下错误信息:

... C2660 : ''test'' :function does not take 1 parameters

在不放弃多态行为的情形下,我能不能同时重载和改写某个函数?

很多C++程序员都对这个问题感到困惑,为理解开这个惑点,有两个概念你必必要了然于心.一个是重载,一个是名字空间.从重载的视角看,你大概认为C++应当按照你所想象的方法工作;也就是假如派生类只改正此中的一个重载函数的行为,那么别的一个应当按照普通的方法被担当.但从名字空间的角度看,当C++试图办理某个标记名时,它以由近到远的次序举行搜索,它首先找本地变量,然后是类成员名,接着是基类名,全局变量…….一旦编译器解析了名字,它便终止解析历程.假如在差别的名字空间范围碰到同一个标记名,那么它便没有了主张.在你的代码中,一旦编译器确命名字"test"呈目前类D中,那么它的名字空间就为类D.不管你调用不带参数的test也好,还是调用带一个整型参数的test(17)也好,编译器都是遵守准这个法则来办理名字问题.关于有整型参数的test(int x)函数,一旦编译器肯定函数名test生存在类D中,它便终止范围探查,然后查找与参数匹配的函数.由于它没有在类D中找到带整型参数的函数,所以报错.此时编译器认为函数D::test(void)躲藏了函数B::test(int).你大概会问,为什么要按这种方法处理?问得好.想找到答案,请参考Bjarne Stroustrup 的C++注释参考手册(Section 13.1).简单地说,在类层次深处搜索与某个签名匹配的重载函数比不搜索更大概招致混乱.

那么若何办理上面呈现的问题呢?很简单.只要在派生类中成立另一个显式调用基类的test函数便可,如:

class D : public B {
public:
 virtual void test(int x) { B::test(x); }
 ……
};

这样,D就有了两个test函数,问题也办理了. 其实这个问题还有别的一个解法:那就是在派生类中利用"using"关键字.如:

class D : public B {
public:
  using B::test;
  // 改写test
  virtual void test() {
     cout << "D::test()
";
  }
};

这个关键字将B::test带入类D中.它的长处是当类B扩大更多的test重载函数时,你不用再去重写类D的代码.这样省了很多事.只要你利用using关键字,那么就意味着全部重载的 B::test函数都进入类D并且得到担当.这种特点大概关于某些人来说是长处,而关于别的一些人来说是缺陷,依靠于你要做什么事情.假如你想要向类D的用户躲藏某些test函数,则可以用第一种办法(显式调用基类),大概让你想要躲藏的函数成为private 或 protected范例.假如你读过Scott的书《Effective C++》,还可以用第二种办法操纵using关键字巧妙地保证基类的私隐.class B {
public:
  func1();
  func2(double d);
  virtual test();
  virtual test(int x);
};
// D 从B中奥秘派生
class D : private B {
public:
  // 让全部 B::test 函数为 public范例
  using B::test;
};

明显,当但愿完好躲藏类B时,这个办法很有效,但假如想要公开B中的个体函数,则这个办法就不是那么好了.


  以上是“<b>如安在派生类中的躲藏基类的虚拟重载函数</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .