Peronal Link: http://segmentfault.com/a/1190000002464822

这节课讲了本门课程 面向对象程序设计中最为重要的一个部分 - 多态

 /*************************************************************************
> File Name: polymorphism.cpp
> Author: Jeremy Wu
> Created Time: Mon 25 May 2015 10:04:07 AM CST
> Function: tune every instrument
************************************************************************/ //多态:一个接口,多种实现
//发生多态现象的条件:
// 1.通过调用虚函数(基类中必须要有,派生类中可有可无建议加上)
// 2.借助指针或者引用调用该虚函数
//
//虚函数只能是 非静态 成员函数
//如果类中有虚函数,最好把 析构函数 也定义为虚函数
//
//如果基类的析构函数是虚函数,由它派生的所有的派生类的析构函数都 自动 成为虚函数
// ·构造函数无法定义为虚函数
//
//基类可以指向它的所有的派生类
//相当于基类给所有的派生类提供了统一的接口
//一般不会直接创建基类的对象
//
//{ 抽象基类 }
//如果一个类中包含纯虚函数,就是抽象类
//抽象类无法创建对象
//如果需要 避免 创建基类对象,应该使用纯虚函数 //接下来是一个例子,有一个基类叫做乐器类
//由它派生出Wind , Brass 和 Gitar 三个类 #include <iostream> using namespace std; class Instrument {
public:
virtual void play (); //virtual 关键字
Instrument () { cout << "Instement () " << endl; }
virtual ~Instrument () { cout << "~Instement () " << endl; }
}; void Instrument::play () { //类的外部定义前不用加 virtual 关键字
cout << "Instrument::play ()" << endl;
} class Wind : public Instrument{
virtual void play () { cout << "Wind::play () " << endl; } //派生类中 virtual 关键字可加可不加
~Wind () { cout << "Wind::~Wind ()" << endl; }
}; class Brass : public Instrument {
virtual void play () { cout << "Brass::play ()" << endl; }
~Brass () { cout << "Brass::~Brass () " << endl; }
}; class Gitar : public Instrument {
virtual void play () { cout << "Gitar::play ()" << endl; }
~Gitar () { cout << "Gitar::~Gitar ()" << endl; }
}; //inst 指针在定义的时候,是静态类型
//在程序运行过程中,它的动态类型就会根据指向对象的类型作改变
//
//有时候把动态绑定称为运行时绑定,也称后继绑定
//run-time binding void tune (Instrument * inst) { //引用传递 或者用指针
inst->play (); //Dynamic binding
//在编译时进行 动态绑定
} int main () { Instrument * p = new Gitar;
Instrument * p2 = new Wind; delete p;
delete p2; return ;
}

接下来老师出了一道题目

描述如下:

以下是我的 Solution:

 /*************************************************************************
> File Name: ployPROB.cpp
> Author: Jeremy Wu
> Created Time: Mon 25 May 2015 10:50:07 AM CST
************************************************************************/ //定义一个形状类的继承结构
//
//Shape -> Triangle
// -> Rectangle
// -> Circle
//
//给形状定义两个操作:
// getArea () 求面积
// getLength () 求周长 #include <iostream>
#include <cmath> const double PI = 3.1415926; using namespace std; class Shape {
public:
virtual double getArea () = ;
virtual double getLength () = ;
virtual ~Shape () { cout << "~Shape ()" << endl; }
Shape () { cout << "Shape ()" << endl; }
}; class Triangle : public Shape {
private:
double x, y, z;
public:
double getArea () {
double p = (x + y + z) / 2.0;
return sqrt (p * (p - x) * (p - y) * (p - z));
}
double getLength () { return x + y + z; }
Triangle (double ix = 0.0, double iy = 0.0, double iz = 0.0) {
x = ix, y = iy, z = iz;
}
~Triangle () { cout << "~Triangle () " << endl; }
}; class Rectangle : public Shape {
private:
double x, y;
public:
double getArea () { return x * y; }
double getLength () { return 2.0 * (x + y); }
Rectangle (double ix = 0.0, double iy = 0.0) {
x = ix, y = iy;
}
~Rectangle () { cout << "~Rectangle () " << endl; }
}; class Circle : public Shape {
private:
double r;
public:
double getArea () { return PI * r * r; }
double getLength () { return 2.0 * PI * r; }
Circle (double ir = 0.0) {
r = ir;
}
~Circle () { cout << "~Circle ()" << endl; }
}; void test (Shape & sp) {
cout << "/***********************************/" << endl;
cout << '\t' << "Area is " << sp.getArea () << endl;
cout << '\t' << "Length is " << sp.getLength () << endl;
cout << "/***********************************/" << endl;
} int main () { Circle p1 (3.0);
Rectangle p2 (3.0, 6.0);
Triangle p3 (1.0, 2.0, 1.5); test (p1);
test (p2);
test (p3); return ;
}

以下是官方版 Solution:

 /*************************************************************************
> File Name: example.cpp
> Author: Jeremy Wu
> Created Time: Mon 25 May 2015 11:34:47 AM CST
************************************************************************/ #include <iostream>
#include <cmath> using namespace std; class Shape {
public:
virtual double area () = ; //不实现基类可以这么写,表示定义一个纯虚函数
virtual double zhou () = ; //pure virtual function
}; class Triangle : public Shape {
double a, b, c;
public:
Triangle (double aa, double bb, double cc) : a (aa), b (bb), c (cc) {}
virtual double area () {
double p = 0.5 * (a + b + c);
return sqrt (p * (p - a) * (p - b) * (p - c));
}
virtual double zhou () {
return a + b + c;
}
}; class Rectangle : public Shape {
double a, b;
public:
Rectangle (double aa, double bb) : a (aa), b (bb) {}
virtual double area () {
return a * b;
}
virtual double zhou () {
return 2.0 * (a + b);
}
}; class Circle : public Shape {
double r;
public:
Circle (double rr) : r (rr) {}
virtual double area () {
return 3.14159 * r * r;
}
virtual double zhou () {
return 2.0 * 3.14159 * r;
}
}; void printArea (Shape * p) {
cout << p->area () << endl;
} void printZhou (Shape * p) {
cout << p->zhou () << endl;
} int main () { Shape * p1, * p2, * p3; //Shape sp; p1 = new Triangle (, , );
p2 = new Rectangle (, 4.6);
p3 = new Circle (5.8); printArea (p1);
printArea (p2);
printArea (p3); printZhou (p1);
printZhou (p2);
printZhou (p3); return ;
}

{key}面向对象程序设计-C++ polymorphism 【第十三次上课笔记】的更多相关文章

  1. 201871010126 王亚涛《面向对象程序设计 JAVA》 第十三周学习总结

      内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...

  2. 201771010123汪慧和《面向对象程序设计Java》第十三周实验总结

     一.理论部分 1.GUI为用户提供交互式的图形化操作界面. (1)提供了程序的外观和感觉.(2)程序利用图形用户界面接受用户的输入,向用户输出程序运行的结果. 2.Java有专门的类库生成各种标准图 ...

  3. 面向对象程序设计-C++ Inheritance & Multiple inheritance & RTTI【第十三次上课笔记】

    Sadly, 这节课带过去的笔记本没电了 T^T 导致没有一行 Code, Sorry 笔记如下: Shape * p1; //使用指针创建对象的方法 p = new Circle (2.0); Sh ...

  4. 面向对象程序设计-C++ Stream & Template & Exception【第十五次上课笔记】

    这是本门<面向对象程序设计>课最后一次上课,刚好上完了这本<Thinking in C++> :) 这节课首先讲了流 Stream 的概念 平时我们主要用的是(1)在屏幕上输入 ...

  5. 201871010128-杨丽霞《面向对象程序设计(java)》第十三周学习总结

    201871010128-杨丽霞<面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  6. “2017面向对象程序设计(Java)第十三周学习总结”存在问题的反馈及本周教学安排

    “2017面向对象程序设计(Java)第十三周学习总结”存在问题的反馈及本周教学安排1. 图形界面事件处理技术是Java GUI编程核心技术,要求同学们掌握其基本原理和基本编程模型:2. 本周四理论课 ...

  7. 201871010116-祁英红《面向对象程序设计(java)》第十三周学习总结

    博文正文开头格式:(2分) 项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://ww ...

  8. 201871010123-吴丽丽《面向对象程序设计(Java)》第十三周学习总结

    201871010123-吴丽丽<面向对象程序设计(Java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  9. 201271050130-滕江南-《面向对象程序设计(java)》第十三周学习总结

      201271050130-滕江南-<面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daiz ...

随机推荐

  1. 【转载】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型

    1.#!/usr/bin/python 是用来说明脚本语言是 python 的 是要用 /usr/bin下面的程序(工具)python,这个解释器,来解释 python 脚本,来运行 python 脚 ...

  2. linux(ubuntu) 遇到的问题 --1

    1.使用sudo提示用户不在sudoers文件中的解决方法 切换到root用户 su root 查看/etc/sudoers文件权限,如果只读权限,修改为可写权限 [root@localhost ~] ...

  3. zip文件压缩(转)

    zip文件结构            上面中的每一行都是一个条目,zip文件就是由一个或者多个条目组成.      条目在Java中对应ZipEntry类         创建zip压缩文件     ...

  4. Flex的学习资源

    学习网站 http://www.adobe.com/cn/devnet/flex.html Adobe Flex开发人员中心 http://www.adobe.com/cn/devnet/flex/v ...

  5. Tree(未解决。。。)

    Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  6. Ubuntu 12.10 安装JDK7

    1.首先到oracle下载上下载jdk-7u25-linux-i586.tar.gz 2.将jdk-7u25-linux-i586.tar.gz复制到/usr/lib/jvm/目录以下,这里假设没有j ...

  7. MyReport报表引擎2.6.5.0新功能

    新的文本渲染引擎,打印旋转时保持文本高精度矢量输出,打印更清晰.  watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva29uZ195ZWU=/font/5a6 ...

  8. 【科研论文】基于文件解析的飞行器模拟系统软件设计(应用W5300)

    摘要: 飞行器模拟系统是复杂飞行器研制和使用过程中的重要设备,它可以用来模拟真实飞行器的输入输出接口,产生与真实系统一致的模拟数据,从而有效避免因使用真实飞行器带来的高风险,极大提高地面测发控系统的研 ...

  9. c#与.NET的区别

    C#与.NET的关系 C# 可以通过.NET平台来编写 部署 运行.NET应用程序VB.NET.......NET语言 C#是专门为.NET平台而生的(面向对象) .NET平台的重要组成:1.FCL- ...

  10. 【前端】使用weinre对手机、微信浏览器页面调试

    官方网站:http://people.apache.org/~pmuellr/weinre-docs/latest/ windows下安装以及使用: 1.安装nodejs 下载nodejs引擎,32b ...