{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 ...
随机推荐
- python10min系列之多线程下载器
今天群里看到有人问关于python多线程写文件的问题,联想到这是reboot的架构师班的入学题,我想了一下,感觉坑和考察的点还挺多,可以当成一个面试题来问,简单说一下我的想法和思路吧,涉及的代码和注释 ...
- 不用注册热键方式在Delphi中实现定义快捷键(又简单又巧妙,但要当前窗体处在激活状态)
第一步:在要实现快捷键的窗体中更改属性“KeyPreview”为True:第二步:在要实现快捷键的窗体中的OnKeyPress事件中填入一个过程名称(在Object Inspector中),填写好后回 ...
- BZOJ 1005 明明的烦恼 (组合数学)
题解:n为树的节点数,d[ ]为各节点的度数,m为无限制度数的节点数. 则 所以要求在n-2大小的数组中插入tot各序号,共有种插法: 在tot各序号排列中,插第一个节点的 ...
- Parsing HTML with C++ (using Qt preferably) - Stack Overflow
Parsing HTML with C++ (using Qt preferably) - Stack Overflow Parsing HTML with C++ (using Qt prefera ...
- Android4.3模拟器界面中右侧菜单按钮无法使用问题解决办法
开发环境:笔记本电脑Windows2008+MyEclipse 10+Android4.3 问题描述:运行或者调试Android项目时,发现模拟器中右侧Menu按钮无法点击,截图如下: 查看在Andr ...
- IOS文件沙盒
在进行IPhone开发的时候,常常需要将简单的数据保存到文件中,以便下次再重新打开的时候能够读取文件中保存的数据. 下面就来做一个简单的demo: 步骤: 1.创建一个SingleView项目,带有x ...
- NeHe OpenGL lession 4
// lession4.c #include <OpenGL/OpenGL.h> #include <GLUT/GLUT.h> #include <stdio.h> ...
- iOS中怎样加入自己定义的字体
苹果对于开发,确实在细节方面下了非常大的功夫,只是不管一个平台下多大的功夫,仍然会有些需求是无法涵盖的.比方字体吧. 我们的应用为了能更加个性化.会须要不同的字体.有时候有些字体是非常特殊的.甚至是购 ...
- PeopleEditor的取值及赋值
/// <summary> /// 从PeopleEditor取值 /// </summary> /// <param name="peopleEditor&q ...
- 通过JavaScript判断当前浏览器版本
从别人处拷贝,只用于自己学习之用.参考源自:http://www.cnblogs.com/leadzen/archive/2008/09/06/1285764.html JavaScript是前端开发 ...