Inheritance -II.

Slides:



Advertisements
Similar presentations
C++语言程序设计教程 第5章 构造数据类型 第6章 C++程序的结构.
Advertisements

第 2 章 初探 C++.
四資二甲 第三週作業 物件導向程式設計.
程設一.
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
類別與物件 Class & Object.
第15章 繼承與多重繼承 15-1 繼承的基礎 15-2 覆寫與隱藏父類別的成員 15-3 子類別的建構與解構子 15-4 多重繼承
第7单元 面向过程编程—— 继承与多态.
Data Abstraction: The Walls
第八章 类和对象.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
走向C++之路 WindyWinter WindyWinter感谢诸位前来捧场。
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
資料大樓 --談指標與陣列 綠園.
函數(一) 自訂函數、遞迴函數 綠園.
Chap 18 類別與物件 夫有土者,有大物也。有大物者,不可以物。 物而不物,故能物物。 明乎物物者之非物也,豈獨治天下百姓而已哉!
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
Classes: A Deeper Look, Part 1
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
创建型设计模式.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
Object-Oriented Programming:
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
前處理指令可以要求前處理器 (preprocessor) 在程式編譯之前,先進行加入其它檔案的內容、文字取代以及選擇性編譯等工作。
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
程式撰寫流程.
C 語言簡介 - 2.
Object-Oriented Programming: Polymorphism
C#面向对象程序设计 $7 继承和多态性.
第九單元 Classes and data abstraction I
面向对象程序设计 QQ群: Object-Oriented Programming 汽车学院.
类类型 C++支持的内置类型和操作,如 int i=10; i=i%6; i=i+4;
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
第7章 繼承/多型/介面 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
Classes (2) Lecture 7.
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
劉崇汎 崑山科技大學 電腦與通訊系 DLL的建立與引用 劉崇汎 崑山科技大學 電腦與通訊系
C++大学基础教程 第11章 多态性 北京科技大学 信息基础科学系 2019/4/8 北京科技大学.
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
Speaker: Liu Yu-Jiun Date: 2009/4/29
C#程序设计基础 $3 成员、变量和常量.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
Speaker: Liu Yu-Jiun Date: 2009/5/6
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
C++程式設計入門 變數與運算子 作者:黃建庭.
C++大学基础教程 第10章 运算符重载 北京科技大学 2019/5/7 北京科技大学.
#include <iostream.h>
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
第 5 章 继承、多态和虚函数 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
RecyclerView and CardView
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
Arguments to the main Function and Final Project
第2章 Java语言基础.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
C++语言程序设计(第4版) 第七章 继承与派生 数学与统计科学学院 胡凤珠.
變數與資料型態  綠園.
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
第6章 继承和多态 伍孝金
Presentation transcript:

Inheritance -II

Contents Member Functions 1 Access Control 2 Case Study 3

Member functions The member functions of the derived class can be derived from its base class.(派生类成员函数可以从基类中派生) int main() { Manager Jack("Jack", 10, 5); Jack.print(); return 0; } class Employee{ public: Employee(string& n, int d) { name = n; department = d; } void print() const { cout << name << department << endl; } private: string name; int department; }; Result: Jack10 class Manager : public Employee{ public: Manager(string& n, int d, int lvl) : Employee(n, d), level(lvl){} private: int level; };

Member functions class Employee{ public: Employee(string& n, int d) { name = n; department = d; } void print() const { cout << name << department << endl; } private: string name; int department; }; The member functions of the derived class can also be re-defined when their names are the same as ones of its base class.(当派生类的成员函数与基类的函数重名时,可以重定义派生类的成员函数) class Manager : public Employee{ public: Manager(string& n, int d, int lvl) : Employee(n, d), level(lvl){} void print() const; private: int level; }; Cant access the private members in the other class ? How to define it void Manager::print() { cout << name << department; cout << level; }

Member functions Overriding functions (覆写基类成员函数) class Manager : public Employee{ public: Manager(string& n, int d, int lvl) : Employee(n, d), level(lvl){} void print() const; private: int level; }; Overriding functions (覆写基类成员函数) void Manager::print() { print(); cout << level; } void Manager::print() { Employee::print(); cout << level; } Redefining member functions of the base class in the derived class. Change the implementation of the base class functions.(在派生类中重定义基类的成员函数,改变基类成员函数的实现) 覆盖基类原有的成员函数

Member functions Overriding functions and overloading functions (覆写与重载函数) When you override a function of the derived class, the corresponding functions must have the same return type, name, number, and types of parameters.(相同的函数原型) (当覆写派生类的函数时,对应的函数必须有完全相同返回类型, 函数名, 参数个数和类型). When you overload a function of the derived class, the function can have the same name and different parameter list.(不同的函数原型) (当重载保生类的函数时,有相同函数名,但参数不同)

Access Control(存取控制) # Access control in a class The members of a class are classified into three categories: private(私有), protected(保护), or public(公有). Test - a: int + b: int # c: int If it is private, its name can be used only by member functions and friends of the class in which it is declared.(只能本类成员和友元访问) If it is public, its name can be used by any function.(任何函数访问) If it is protected, its name can be used only by member functions and friends of the class in which it is declared and by member functions and friends of classes derived from this class.(只能本类成员和友元以及它的派生类成员和友元访问) #

Access Control Protected members(保护成员) //error- private int main() { Test ta(20, 30); ta.a = 99; ta.b = 100; ta.c = 50; cout << ta.geta() << endl; cout << ta.getb() << endl; cout << ta.c << endl; return 0; } class Test{ int a; protected: int b; public: int c; Test(int n, int m) :a(n), b(m){} int geta(){ return a; } int getb(){ return b; } }; //error- private //error -protected //ok- public

Access Control

Different Inheritances Access to Base Classes Like a member in a class, the base class can be declared private, protected, or public.( 基类可以有三种派生:私有、保护和公有) Public derivation makes the derived class a subtype of its base class, it is the most common form of derivation; class Manager: public Employee{};

Different Inheritances Protected and private derivations are used to represent implementation detail. Protected base classes are useful in class hierarchies in which further derivation is the norm; class Manager: protected Employee{}; Private base classes are most useful when defining a class by restricting the interface to base so that stronger guarantees can be provided. class Manager: (private) Employee{ }; // (default private)

Different Inheritances Base class Access control Derived class General users inheritance private private NA NA protected private A public protected A public A A

Different Inheritances class RichMan { public: RichMan(); ~RichMan(); int company; //公司能被自己(基类),创业伙伴(友元),儿子(子类),其他人(外部)都可以访问 private://钱和车子能被自己(基类),创业伙伴(友元)可以访问.儿子和外人都不给开 int money; int car; protected: int house; // 房子能被自己(基类),创业伙伴(友元)可以访问,儿子(子类)也可以访问,外人是不可以访问 }; RichMan car: int money: int # house: int + company: int + RichMan() + ~RichMan()

Public Inheritance class LittleRichMan : public RichMan RichMan { }; RichMan car: int money: int # house: int + company: int + RichMan() + ~RichMan() LittleRichMan + LittleRichMan() + ~LittleRichMan() public public class LittleRichMan : public RichMan { public: LittleRichMan(); ~LittleRichMan(); int m_company;//base class protected: int m_house; //base class }; 他的儿子继续开着公司,住着房子,但他爸爸的车子和钱是拿不到

Protected Inheritance class LittleRichMan : protected RichMan { public: LittleRichMan(); ~LittleRichMan(); }; RichMan car: int money: int # house: int + company: int + RichMan() + ~RichMan() LittleRichMan + LittleRichMan() + ~LittleRichMan() protected protected class LittleRichMan : protected RichMan { public: LittleRichMan(); ~LittleRichMan(); protected: int m_company;// base class int m_house;// base class }; 公司和房子是除了外人不可以访问,自己,友元,子类都可以访问

Private Inheritance class LittleRichMan : private RichMan { public: }; RichMan car: int money: int # house: int + company: int + RichMan() + ~RichMan() LittleRichMan + LittleRichMan() + ~LittleRichMan() private private class LittleRichMan : private RichMan { public: LittleRichMan(); ~LittleRichMan(); private: int m_company;//base class int m_house;// base class }; 儿子占用了公司和房子,这样除了自己和友元,任何方式都不得访问

Case Study Design a system that opens different postfixed files, e.g. .txt, .png and etc. textFile + openFile(): void File # filename: string imageFile

class File{ public: File(string& filename) { fileName = filename; } void openFile() { cout << "Open file!\n"; } protected: string fileName; }; #include <Windows.h> #include <ShellAPI.h> #include <iostream> using namespace std; 在C++标准里定义了两个字符串string和wstring string看作char[], wstring使用的是wchar_t类型,宽字符,用于满足非ASCII字符的要求,例如Unicode编码,中文,日文,韩文等。 class textFile :public File{ public: textFile(string& filename) :File(filename){} void openFile() { fileName = fileName + ".txt"; wstring temp(fileName.begin(),fileName.end()); LPCWSTR lpFile = temp.c_str(); //wstring -> char* ShellExecute(NULL, L"open", L"notepad.exe", lpFile, NULL, SW_SHOW); } }; LPCWSTR是一个指向unicode编码字符串的32位指针,所指向字符串是wchar型,而不是char型

class bmpFile :public File{ bmpFile(string& filename) :File(filename){} void openFile() { fileName = fileName + ".png"; wstring temp(fileName.begin(), fileName.end()); LPCWSTR lpFile = temp.c_str(); ShellExecute(NULL, L"open", L"mspaint.exe", lpFile, NULL, SW_SHOW); } }; int main() { string filename = "aa"; textFile text(filename); text.openFile(); //Sleep(3000); system("pause"); bmpFile bmp(filename); bmp.openFile(); return 0; }

Summary Be able to override the member function of derived class Be able to know access control in the class Be able to know the difference of private, protected and public inheritances Understand the concept of inheritance