首先先给出一个基类Base和一个子类Derived
#pragma once
#include<string>
#include<iostream>
using std::string;
using std::cout;
class Base
{
public:
Base();
Base(string s):str(s){}
virtual void print()
{
cout << str << " ";
}
~Base();
private:
string str;
};
#pragma once
#include "Base.h"
class Derived :
public Base
{
public:
Derived();
Derived(string s,int i):Base(s),ival(i){}
void pinrt()
{
Base::print();
cout << ival << "\n";
}
void print_ival()
{
cout << "仅输出ival的值" << ival << "\n";
}
~Derived();
private:
int ival;
};
此处的Derived的父类是Base,然后我们来实验。
#include"Base.h"
#include"Derived.h"
#include<iostream>
#include<string>
using std::cout;
using std::endl;
using std::string;
int main()
{
Base base("liu");
Derived de("wang", 23);
Base* pb = &base;
Derived* p = &de;
if (Derived * pd = static_cast<Derived*>(pb))//此处用于判断指针是否为空指针
{
cout << "change has gone";
pd->print_ival();
}
//此时,pb为Base类型的指针,转化为Derived也就是父类转化为子类,而且这里用的是static_cast也就是静态转换,所以系统会忽略检查,强行进行转换
}
此处的输出:“change has gone仅输出ival的值-858993460”。
说明了什么?也就是静态转换下的基类转化成子类竟然成功了!但是后面的ival值确是一个不知道什么的数。
这是因为,原本的pb指针里根本就没有ival这个值啊,所以即使强行转换成功了,但是成员并没有改变,所以这种转换具有风险性。
但是如果换成动态转换呢?
if (Derived * pd = dynamic_cast<Derived*>(pb))//此处用于判断指针是否为空指针
{
cout << "change has gone";
pd->print_ival();
}
那么pd就成为了空指针,也就是转换失败了,所以dynamic起的作用实际上是检查一下,子类中是否有多余的东西,使得转化过后使用子类的某些功能会发生错误。