第六章 继承性和派生类 胡昊 南京大学计算机系软件所.

Slides:



Advertisements
Similar presentations
第四章 继承与派生 Chapter 4 Inheritance and Derivation
Advertisements

四資二甲 第三週作業 物件導向程式設計.
程序设计实习 3月份练习解答
面向对象的程序设计(一).
第九讲 类与对象 (I)面向对象基础.
類別與物件 Class & Object.
第15章 繼承與多重繼承 15-1 繼承的基礎 15-2 覆寫與隱藏父類別的成員 15-3 子類別的建構與解構子 15-4 多重繼承
第7单元 面向过程编程—— 继承与多态.
第八章 类和对象.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
走向C++之路 WindyWinter WindyWinter感谢诸位前来捧场。
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
第二章 C# 基础知识.
第四章 在 C# 中实现 OOP 概念.
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
第七章 搜索结构 静态搜索结构 二叉搜索树 AVL树.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
哈夫曼编码.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
Object-Oriented Programming:
第3章 继承和派生.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程序设计期末复习 黎金宁
第三章 C++中的C 面向对象程序设计(C++).
Java程序设计 第9章 继承和多态.
Object-Oriented Programming: Polymorphism
第四章 小技巧.
面向对象程序设计 QQ群: Object-Oriented Programming 汽车学院.
第9讲 Java的继承与多态(一) 类的继承 子类的创建 方法覆盖.
Php class 組員: 賴羿陵 林昱廷 莊正暉 張雅晴
C/C++/Java 哪些值不是头等程序对象
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第16章 虛擬與多形 16-1 虛擬函數 16-2 純虛擬函數與抽象類別 16-3 多形 16-4 虛擬繼承與虛擬解構子.
10 多載函數 10.1 多載概論 多載一般函數 多載成員函數 10-3
第三章 C# 基础知识.
第7章 繼承/多型/介面 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
二叉树的遍历.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
第12讲 多继承与虚基类 多继承 虚基类.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第10讲 构造函数和析构函数 构造函数 析构函数 This 指针.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
Inheritance -II.
第三章 数据抽象.
字符串 (String) 字符串是 n (  0 ) 个字符的有限序列, 记作 S = “c1c2c3…cn” 其中,S 是串名字
Object-Oriented Programming in C++ 第二章 类和对象
第二章 Java语法基础.
面向对象技术 练习 ffh.
C++程序设计基础 主讲人:谢昕 华东交通大学信息工程学院 第十~十二讲 多态性和虚函数 2005年春季学期.
第九章 物件導向-進階.
第1章 C++面向对象程序设计要点 1.1 函数和函数参数 1.2 输入输出   1.3 类 1.4 抽象类型和模板.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第 3 章 类的基础部分 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第2章 Java语言基础.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
C++语言程序设计(第4版) 第七章 继承与派生 数学与统计科学学院 胡凤珠.
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
Presentation transcript:

第六章 继承性和派生类 胡昊 南京大学计算机系软件所

重要内容

继承例子 图形 闭合图形 开放图形 多边形 椭圆形 椭圆形 椭圆形 椭圆形 多边形 多边形 多边形

基 类 public: protected: private: general users derived class’s member functions and friends own member functions and friends 基 类 public: protected: private:

继承方式:public方式 基类的对象a 可访问性: a.f(): OK; a.g(): Error; a.h(): Error; 基类A 成员: f(): public; g(): protected; h(): private; 派生类B 成员: f(): public; g(): protected; h(): NONO; 派生类的对象b 可访问性: b.f(): OK; b.g(): Error; b.h(): Error; 派生类的派生类的对象c 派生类的派生类C 可访问性: f(): OK; g(): OK; h(): Error; 可访问性: f(): OK; g(): OK; h(): Error;

继承方式:protected方式 基类的对象a 可访问性: a.f(): OK; a.g(): Error; a.h(): Error; 成员: f(): public; g(): protected; h(): private; 派生类B 成员: f(): protected; g(): protected; h(): NONO; 派生类的对象b 可访问性: b.f(): Error; b.g(): Error; b.h(): Error; 派生类的派生类C 派生类的派生类的对象c 可访问性: f(): OK; g(): OK; h(): Error; 可访问性: f(): OK; g(): OK; h(): Error;

继承方式:private方式 基类的对象a 可访问性: a.f(): OK; a.g(): Error; a.h(): Error; 基类A 成员: f(): public; g(): protected; h(): private; 派生类B 成员: f(): private; g(): private; h(): NONO; 派生类的对象b 可访问性: b.f(): Error; b.g(): Error; b.h(): Error; 派生类的派生类C 派生类的派生类的对象c 可访问性: f(): OK; g(): OK; h(): Error; 可访问性: f(): Error; g(): Error; h(): Error;

class A { public: void f(); protected: void g(); private: void h(); }; class B: protected A //g对A类成员的访问不受B的继承方式影响,除了h,其他都能访问 class C: public B { public: void r() q(); //OK f(); //OK g(); //OK h(); //Error } }; B b; b.q(); //OK b.f(); //Error b.g(); //Error b.h(); //Error

class A { public: void f1(); void f2(); void f3(); protected: class B: private A { public: A::f1; A::g1; protected: A::f2; A::g2; private: A::f3; }; B b; b.f1(); b.g1(); b.f2(); b.g2(); class A { public: void f1(); void f2(); void f3(); protected: void g1(); void g2(); void g3(); }; // ok // error

class A { int x, y; public: void f(); void g() { ... x ... } }; class B: public A { int z; void h() { ... x ... g(); }   // error // ok

派生类对象的初始化和赋值操作 B b1; class A B b2(1); { B b3(1, 2); int x; public: A() {x=0;} A(int i) {x=i; } }; class B: public A int y; B() {y=0;} B(int i) {y=i;} B(int i, int j):A(i) {y=j; }

单继承举例Employee (一) class Employee //普通职员类 { String name; int salary; public: Employee(const char *s, int n=0): name(s) salary = n; } void set_salary(int n) { salary = n; } int get_salary() const { return salary; } String get_name() const { return name; } };

单继承举例Employee (二) const int MAX_NUM_OF_EMPS=20; class Manager: public Employee //部门经理 { Employee *group[MAX_NUM_OF_EMPS]; int num_of_emps; public: Manager(const char *s, int n=0): Employee(s,n) num_of_emps = 0; } Employee *add_employee(Employee *e) if (num_of_emps >= MAX_NUM_OF_EMPS) return NULL; group[num_of_emps] = e; num_of_emps++; return e;

单继承举例Employee (三) Employee *remove_employee(Employee *e) { int i; for (i=0; i<num_of_emps; i++) if (e->get_name() = = group[i]->get_name()) break; if (i < num_of_emps) int j; for(j=i+1; j<num_of_emps; j++) group[j-1] = group[j]; num_of_emps--; return e; } else return NULL; };

单继承举例LinearList (一) class LinearList { ...... public: { ...... public: bool insert( int x, int pos ); bool remove( int &x, int pos ); int element( int pos ) const; int search( int x ) const; int length( ) const; };

单继承举例LinearList(二) class Queue: private LinearList { public: bool en_queue(int x) { return insert(x,length()); } bool de_queue(int &x) return remove(x,1); };

名冲突(1) class A { public: void f(); void g(); }; class B { void h(); class C: public A, public B void func() {f(); } //error, 是A的f,还是B的f } C c; c.f(); //error, 是A的f, 还是B的f

名冲突(2) class C: public A, public B { public: void func() A::f(); //OK, 调用A的f。 B::f(); //OK, 调用B的f。 } }; C c; c.A::f(); //OK, 调用A的f c.B::f(); //OK, 调用B的f

重复继承(1) class X{ public: int a; void X(){ a=10; } }; class X1:public x{ x1(){ cout<< a<<endl; } } class X2:public x{ X2(){ cout<< a<<endl;

重复继承(2) X X2 X1 Y class Y : public X1,public X2{ public: Y(){ cout<< a << endl; } }; void f(Y* pY ){ pY->a = 0; //error pY->X::a = 0; //error pY->X1::a = 0; pY->X2::a = 0; X1 X X2 Y

重复继承-虚基类(3) class X { public: int a; void X(){ a=10; } }; class X1: virtual public X { } class X2: virtual public X class Y: public X1, public X2

虚基类的派生类对象存储结构示意图: X X1 X2 Y b1 b2 d X1类子对象 X2类子对象 Y类对象 a X类子对象