贺州信息港
时尚
当前位置:首页 > 时尚

OO的bugC的bug还是编译器的bug

发布时间:2019-06-20 05:27:21 编辑:笔名

  OO的bug,C++的bug,还是编译器的bug?

  按照面向对象的理论派生类可以直接继承基类的公有方法.例如:

  class base

  {

  public:

  void fun(const int arg)

  {

  }

  };

  class derive: public base

  {

  };

  现在类derive就自然而然的有了一个void fun(const int arg)的方法.这个方法就是从类base继承而来的.然而这一却在引入模板后就变的混挑乱不堪了.请看下面这两个类.

  class base

  {

  public:

  templateclass T

  void fun(const int arg)

  {

  }

  };

  class derive: public base

  {

  };

  这次类base有一个成员模板函数templateclass Tvoid fun(const int arg),按照OO的理论,类derive也自然有这个成员模板函数.那么好吧.我们就来特化类derive的这个成员模板函数.于是我们写下了一个这样的特化:

  template

  void derive::fun int (const int arg)

  {

  }

  然而这个特化却不能被编译器支持.在G++中会有编译错误,说”derive中没有函数fun”.类derive不是从类base中继承了函数fun了吗?

  在vc中倒是能编译通过,但却会有一个非常奇怪的运行结果.为了看到个结果我们来让类base的fun函数输出它的函数名,同时我们也让特化后的类derive的fun也输出函数名.改完后的代码如下:

  class base

  {

  public:

  templateclass T

  void fun(const T arg)

  {

  cout "\t" __FUNCTION__ endl;

  }

  };

  class derive: public base

  {

  };

  template

  void derive::fun int (const int arg)

  {

  cout "\t" __FUNCTION__ endl;

  }

  下面我们来测试这些代码. 测试如下:

  derive obj;

  n(8);

  n(8.8);

  输出结果有点出人意料.这个测试的输出如下:

  base::fun

  base::fun

  竟然两个fun:特化的和非特化的都是类base的. 我们明明是特化的类derive的fun呀.

  查看本文来源

母乳性的黄疸的症状
母乳性的黄疸什么症状
母乳性黄疸宝宝的症状