牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2007-04-05 投稿人: 浏览次数:4255
  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:        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呀.      
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。