关于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;
就属于这种情况,这是典型的向下转型,所以未必是正确的。
#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是对象级别的,也就是说调用它的必须是一个正确的对象才行, // 所以如果这么干,就不会得到类似的结果}