员工是人
人不一定是员工
————》 所以员工可以转为人;而 人 不可以转为员工
改为:
【dynamic_cast 是一个操作符 , 它的作用: 尝试着把 p 这个Person的类型转换成employee
它会去调查这个p所指向的对象是不是employee ,如果是,它会返回合法的指针/地址 ;如果不是,
则会返回 0 值,即NULL,空指针
】
Person.h
Person.cpp 不变
【结论: 答案是真的 p -> employee ,即可实现转化;
因为 main函数中,因为 p 是由e 这个 employee* 类型 转化成 Person*,
它只是指向开头而已,employee跟Person的指向 起始地址是一样的,只不过
类Person的属性(数据成员)地址分配完后,接着就给类employyee的属性(数据成员)
分配地址。
所以接下来函数中 将 p 这个原本是employee* , 后来是Person* 的 转化为 employee* ,是可以实现的
】
那我们来实现下 原本不是指向employy的 然后要转向employee, 看下能不能成功?
为了演示效果:这里我们直接新加一个类
【结论: 类型转换 建议用 dynamic_cast
最好不要用 强制类型转换,很危险。
】
所以我们建议用 dynamic_cast
但其实还是有其他风险:
如
因为其实本身 e是Employee,而 p 是引用 e
那我们怎么实现 p.speak()执行的是 Employee的speak函数呢?
多态:
// Demozqw.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
#include <string>
#include "Employee.h"
#include <vector> //向量 , 就像一个指针,容器, 数组一样
using namespace std;
class Shape {
// 父类 形状
public:
void draw() {
cout << "Shape::draw()" << endl;
}