首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

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

关于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是对象级别的,也就是说调用它的必须是一个正确的对象才行,                                        // 所以如果这么干,就不会得到类似的结果} 

热点排行