{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 ...
随机推荐
- KISSY对vm的抽取
vm <script type="text/javascript"> KISSY.use(['bops/js/forced-closure', 'common/js/t ...
- C# 读书笔记之访问虚方法、重写方法和隐藏方法
C#允许派生类中的方法与基类中方法具有相同的签名:基类中使用关键字virtual定义虚方法:然后派生类中使用关键字override来重写方法,或使用关键字new来覆盖方法(隐藏方法). 重写方法用相同 ...
- 共享内存操作类(C#源码)
原文 http://blog.csdn.net/yefanqiu/article/details/1717458 VC++的共享内存操作代码实现起来相对比较容易,但是用C#语言来实现,就有一定难度,由 ...
- hdoj 2222 Keywords Search(AC自动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 思路分析:该问题为多模式匹配问题,使用AC自动机解决:需要注意的问题是如何统计该待查询的字符串包 ...
- View中的onTouchEvent()与setOnTouchListener()中的ontouch()方法的事件处理先后顺序
Touch事件的两种情况 1.覆写View.class中定义的onTouchEvent-->基于事件回调监听方式 @Override public boolean onTouchEvent(Mo ...
- ThinkPHP - 事务操作
/* * 添加酒店和房型 * */ public function insertAll($arr_hotel=array(),$arr_room=array()){ $model = new Mode ...
- 在Office Outlook 2013中收发QQ邮件
选择手动配置 选择第三项 点击More Settings,在Outgoing Server 勾选 如下 确认后,按下一步完成配置,此时会弹出对话框进行邮件发送测试.
- 【JAVA】使用Eclipse依赖生成jar包时,避免最外层同时生成资源文件的配置。
使用Eclipse依赖生成jar包时,如果做配置,生成的jar包文件会全部生成在外面,这并不是我们需要的,下面我们一起来修改下配置,使生成的jar包符合我们的需求吧. 1.如果不做任何配置生成的jar ...
- 一个简单链表的C++实现
/* LList.cpp * Author: Qiang Xiao * Time: 2015-07-12 */ #include<iostream> using namespace std ...
- linux: telnet
问题: telnet: connect to address 192.168.1.103: Connection refused 总结:{ 1. 需要开启telnet服务, /etc/xinetd.d ...