读书人

关于C++的纯虚函数解决思路

发布时间: 2012-09-10 11:02:32 作者: rapoo

关于C++的纯虚函数
有这样一段代码:
class Base
{
public:
virtual ~Base(){};
virtual void show()=0;

};

class Derived:public Base
{
public:
virtual void show(){cout<<"derived show....."<<endl;}
void other_show(){cout<<"derived other_show......"<<endl;}
};


int main()
{
Base *b=NULL;
Derived *d=(Derived *)b;//这里把一个指向纯虚基类指针转换为他的派生类对象,感觉有点不对劲,但运行起来是可以的,一般来说,把指向派生类的指针转换为指向基类的指针是安全的,但是这里的写法好吗?
d->other_show();
}

[解决办法]
把指向派生类的指针转换为指向基类的指针是安全的,这句话很正确,也就是所谓的向上转型。

向下转型则反过来,及将指向基类的指针转型为指向派生类的指针,就未必是正确的,楼主的代码:
Base *b=NULL;
Derived *d=(Derived *)b;
就属于这种情况,这是典型的向下转型,所以未必是正确的。

C/C++ code
#include <iostream>using namespace std;class Base{public:  virtual ~Base(){};  virtual void show()=0;};class Derived:public Base{public:    virtual void show()    {        cout<<"derived show....."  <<endl;    }    void other_show()    {        cout<<"derived other_show......"<<endl;    }};int main(){  Base *b=NULL;  Derived *d=(Derived *)b;  d->other_show();    ((Derived *)12345678)->other_show();  // 事实上,你这样写都是可以的。因为other_show是类级别的,所以                                        // 只要->左边的类型是Derived*,都会得到正确调用。                                        // 虚函数show是对象级别的,也就是说调用它的必须是一个正确的对象才行,                                        // 所以如果这么干,就不会得到类似的结果} 

读书人网 >C++

热点推荐