多态性实例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简 单 的 说 ,建 立 一 个 父 类 的 对 象 ,它 的 内 容 可 以 是 这 个 父 类 的 ,也 可 以 是 它 的 子 类的,当子类拥有和父类同样的函数,当使用这个对象调用这个函数的时候,定义这 个对象的类(也就是父类)里的同名函数将被调用,当在父类里的这个函数前加 virtual 关键字,那么子类的同名函数将被调用。
cout<<"this is Shape Area."<<endl; return 0; }
private:
};
//派生类:矩形类 class Rectangle:public Shape { public:
Rectangle(double x, double y) {
width = x; height = y; } double Area() { cout<<"this is Rectangle Area,the Area is:"<<width*height<<endl; return (double)width*height; }
private: double width; double height;
};
//派生类:圆类 class Circle:public Shape { public:
Circle(double x) {
radius = x; } double Area()
Hale Waihona Puke Baidu
{ cout<<"this is Circle Area,the Area is:"<<PI*pow(radius,2)<<endl; return (double)PI*pow(radius,2);
实例程序
#include <iostream> #include <cmath> using namespace std; #define PI 3.1415926
//基类:Shape 类 class Shape { public:
Shape(){} virtual double Area() {
C++ 中 , 实 现 多 态 有 以 下 方 法 : 虚 函 数 , 抽 象 类 , 重 载 , 覆 盖 。
作用
把 不 同 的 子 类 对 象 都 当 作 父 类 来 看 ,可 以 屏 蔽 不 同 子 类 对 象 之 间 的 差 异 ,写 出 通 用 的 代 码 ,做 出 通 用 的 编 程 ,以 适 应 需 求 的 不 断 变 化 。赋 值 之 后 ,父 对 象 就 可 以 根 据 当 前 赋 值 给 它 的 子 对 象 的 特 性 以 不 同 的 方 式 运 作 。也 就 是 说 ,父 亲 的 行 为 像 儿 子 ,而 不 是 儿 子 的 行 为 像 父 亲 。举 个 例 子 :从 一 个 基 类 中 派 生 ,响 应 一 个 虚 命 令 ,产 生 不 同 的结果。比如从某个基类继承出多个对象,其基类有一个虚方法 Tdoit,然后其子类 也有这个方法,但行为不同,然后这些子对象中的任何一个可以赋给其基类的对象, 这 样 其 基 类 的 对 象 就 可 以 执 行 不 同 的 操 作 了 。实 际 上 你 是 在 通 过 其 基 类 来 访 问 其 子 对 象的,你要做的就是一个赋值操作。
} private:
double radius; };
//主程序 void main() {
cout<<"虚函数多态实例:"<<endl; //定义基类对象 Shape * shape; //使用基类初始化 shape = new Shape(); shape->Area();
//使用基类指针调用派生类的实现函数 shape = new Rectangle(2,3); shape->Area(); shape = new Circle(3); shape->Area(); }
C++多态性概念、作用及实例
概念
多 态 指 同 一 个 实 体 同 时 具 有 多 种 形 式 。 它 是 面 向 对 象 程 序 设 计 ( OOD ) 的 一 个 重 要 特 征 。如 果 一 个 语 言 只 支 持 类 而 不 支 持 多 态 ,只 能 说 明 它 是 基 于 对 象 的 ,而 不 是 面 向 对 象 的 。C++ 中 的 多 态 性 具 体 体 现 在 运 行 和 编 译 两 个 方 面 。运 行 时 多 态 是 动 态 多 态 , 其 具 体 引 用 的 对 象 在 运 行 时 才 能 确 定 。编 译 时 多 态 是 静 态 多 态 ,在 编 译 时 就 可 以 确 定 对象使用的形式。
使 用 继 承 性 的 结 果 就 是 可 以 创 建 一 个 类 的 家 族 ,在 认 识 这 个 类 的 家 族 时 ,就 是 把 导出类的对象当作基类的对象,这种认识又叫作 upcasting。这样认识的重要性在于: 我 们 可 以 只 针 对 基 类 写 出 一 段 程 序 ,但 它 可 以 适 应 于 这 个 类 的 家 族 ,因 为 编 译 器 会 自 动 就 找 出 合 适 的 对 象 来 执 行 操 作 。这 种 现 象 又 称 为 多 态 性 。而 实 现 多 态 性 的 手 段 又 叫 称动态绑定(dynamic binding)。
cout<<"this is Shape Area."<<endl; return 0; }
private:
};
//派生类:矩形类 class Rectangle:public Shape { public:
Rectangle(double x, double y) {
width = x; height = y; } double Area() { cout<<"this is Rectangle Area,the Area is:"<<width*height<<endl; return (double)width*height; }
private: double width; double height;
};
//派生类:圆类 class Circle:public Shape { public:
Circle(double x) {
radius = x; } double Area()
Hale Waihona Puke Baidu
{ cout<<"this is Circle Area,the Area is:"<<PI*pow(radius,2)<<endl; return (double)PI*pow(radius,2);
实例程序
#include <iostream> #include <cmath> using namespace std; #define PI 3.1415926
//基类:Shape 类 class Shape { public:
Shape(){} virtual double Area() {
C++ 中 , 实 现 多 态 有 以 下 方 法 : 虚 函 数 , 抽 象 类 , 重 载 , 覆 盖 。
作用
把 不 同 的 子 类 对 象 都 当 作 父 类 来 看 ,可 以 屏 蔽 不 同 子 类 对 象 之 间 的 差 异 ,写 出 通 用 的 代 码 ,做 出 通 用 的 编 程 ,以 适 应 需 求 的 不 断 变 化 。赋 值 之 后 ,父 对 象 就 可 以 根 据 当 前 赋 值 给 它 的 子 对 象 的 特 性 以 不 同 的 方 式 运 作 。也 就 是 说 ,父 亲 的 行 为 像 儿 子 ,而 不 是 儿 子 的 行 为 像 父 亲 。举 个 例 子 :从 一 个 基 类 中 派 生 ,响 应 一 个 虚 命 令 ,产 生 不 同 的结果。比如从某个基类继承出多个对象,其基类有一个虚方法 Tdoit,然后其子类 也有这个方法,但行为不同,然后这些子对象中的任何一个可以赋给其基类的对象, 这 样 其 基 类 的 对 象 就 可 以 执 行 不 同 的 操 作 了 。实 际 上 你 是 在 通 过 其 基 类 来 访 问 其 子 对 象的,你要做的就是一个赋值操作。
} private:
double radius; };
//主程序 void main() {
cout<<"虚函数多态实例:"<<endl; //定义基类对象 Shape * shape; //使用基类初始化 shape = new Shape(); shape->Area();
//使用基类指针调用派生类的实现函数 shape = new Rectangle(2,3); shape->Area(); shape = new Circle(3); shape->Area(); }
C++多态性概念、作用及实例
概念
多 态 指 同 一 个 实 体 同 时 具 有 多 种 形 式 。 它 是 面 向 对 象 程 序 设 计 ( OOD ) 的 一 个 重 要 特 征 。如 果 一 个 语 言 只 支 持 类 而 不 支 持 多 态 ,只 能 说 明 它 是 基 于 对 象 的 ,而 不 是 面 向 对 象 的 。C++ 中 的 多 态 性 具 体 体 现 在 运 行 和 编 译 两 个 方 面 。运 行 时 多 态 是 动 态 多 态 , 其 具 体 引 用 的 对 象 在 运 行 时 才 能 确 定 。编 译 时 多 态 是 静 态 多 态 ,在 编 译 时 就 可 以 确 定 对象使用的形式。
使 用 继 承 性 的 结 果 就 是 可 以 创 建 一 个 类 的 家 族 ,在 认 识 这 个 类 的 家 族 时 ,就 是 把 导出类的对象当作基类的对象,这种认识又叫作 upcasting。这样认识的重要性在于: 我 们 可 以 只 针 对 基 类 写 出 一 段 程 序 ,但 它 可 以 适 应 于 这 个 类 的 家 族 ,因 为 编 译 器 会 自 动 就 找 出 合 适 的 对 象 来 执 行 操 作 。这 种 现 象 又 称 为 多 态 性 。而 实 现 多 态 性 的 手 段 又 叫 称动态绑定(dynamic binding)。