{key}面向对象程序设计-C++ polymorphism 【第十三次上课笔记】
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 【第十三次上课笔记】的更多相关文章
- 201871010126 王亚涛《面向对象程序设计 JAVA》 第十三周学习总结
内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...
- 201771010123汪慧和《面向对象程序设计Java》第十三周实验总结
一.理论部分 1.GUI为用户提供交互式的图形化操作界面. (1)提供了程序的外观和感觉.(2)程序利用图形用户界面接受用户的输入,向用户输出程序运行的结果. 2.Java有专门的类库生成各种标准图 ...
- 面向对象程序设计-C++ Inheritance & Multiple inheritance & RTTI【第十三次上课笔记】
Sadly, 这节课带过去的笔记本没电了 T^T 导致没有一行 Code, Sorry 笔记如下: Shape * p1; //使用指针创建对象的方法 p = new Circle (2.0); Sh ...
- 面向对象程序设计-C++ Stream & Template & Exception【第十五次上课笔记】
这是本门<面向对象程序设计>课最后一次上课,刚好上完了这本<Thinking in C++> :) 这节课首先讲了流 Stream 的概念 平时我们主要用的是(1)在屏幕上输入 ...
- 201871010128-杨丽霞《面向对象程序设计(java)》第十三周学习总结
201871010128-杨丽霞<面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- “2017面向对象程序设计(Java)第十三周学习总结”存在问题的反馈及本周教学安排
“2017面向对象程序设计(Java)第十三周学习总结”存在问题的反馈及本周教学安排1. 图形界面事件处理技术是Java GUI编程核心技术,要求同学们掌握其基本原理和基本编程模型:2. 本周四理论课 ...
- 201871010116-祁英红《面向对象程序设计(java)》第十三周学习总结
博文正文开头格式:(2分) 项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://ww ...
- 201871010123-吴丽丽《面向对象程序设计(Java)》第十三周学习总结
201871010123-吴丽丽<面向对象程序设计(Java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 201271050130-滕江南-《面向对象程序设计(java)》第十三周学习总结
201271050130-滕江南-<面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daiz ...
随机推荐
- Android UiAutomator 自动化测试一些代码实例---新手3
1.打开浏览器,打开百度实例 public void testBrowser() throws RemoteException, UiObjectNotFoundException{ //灭屏幕-亮屏 ...
- C和指针 读书笔记
准备复习一下之前读过的<C和指针>,主要看之前标记过的地方. 感觉像第一次看的地方再记录一下-- 1.预处理器读入源代码,根据预处理指令对其进行修改,然后将修改后的源代码交给编译器. 2. ...
- 菜农群课笔记之ICP与ISP----20110412(整理版)
耗时一上午时间对HOT大叔昨晚的群课内容进行温故并整理,现将其上传,若想看直播可到下面链接处下载:http://bbs.21ic.com/icview-229746-1-1.html 成 ...
- sed 文件查找,替换
sed 命令查找与替换: (1)删除第2,3行:sed '2,3d' test.txt > new.txt (2)替换: 替换所有:sed 's/abc/ABC/' test.txt > ...
- hdoj 1532 Drainage Ditches(最大网络流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 思路分析:问题为最大网络流问题,给定一个有向图,需要求解该有向图的最大网络流,使用Edmonds ...
- 一个发送电子邮件的bash脚本
第一个命令行參数会被当邮件内容发送出去 #!/bin/bash #@author Liuyang #@date 2015-02-15 Recipients=xxx@xx.com FROM=xxx@xx ...
- 专门针对初学者的Node.js教程
转载原文:http://www.csdn.net/article/2013-08-28/2816731-absolute-beginners-guide-to-nodejs Node.js的教程并不缺 ...
- webform中listbox运用,2个相互传值练习1:
AppendDataBoundItems(将数据绑定项追加到静态声明列表项上)属性改为Ture;SelectionMode(列表的选择模式改为多项)属性改为Multiple using System; ...
- [C++参考]私有成员变量的理解
私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量. 然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了 ...
- plsql 的循环之 goto
实例: /* 测试goto 的用法, */ procedure test_loop_go(pi_aab001 in number, po_fhz out varchar2, po_msg out va ...