科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件OO的bug,C++的bug,还是编译器的bug?

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

当继承遭遇模板时带来的混乱,OO的bug,C++的bug,还是编译器的bug?

作者: guanwl 来源:CSDN 2008年2月5日

关键字: C++ Bug 编译器 Linux

  • 评论
  • 分享微博
  • 分享邮件
OObug,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:
       template<class T>
       void fun(const int& arg)
       {
       }
    };
 
    class derive: public base
    {
    };
这次类base有一个成员模板函数template<class T>void 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:
       template<class 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;
       obj.fun(8);
       obj.fun(8.8);
输出结果有点出人意料.这个测试的输出如下:
base::fun
base::fun
竟然两个fun:特化的和非特化的都是类base的. 我们明明是特化的类derive的fun呀.
 
 
查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章