includeiostream 8 1 using namespace std class A

  • Slides: 126
Download presentation

#include<iostream> 例8 -1 公有继承的测试 using namespace std ; class A { public : void

#include<iostream> 例8 -1 公有继承的测试 using namespace std ; class A { public : void get_XY() { cout << "Enter two numbers of x, y : " ; cin >> x >> y ; } void put_XY() { cout << "x = "<< x << ", y = " << y << 'n' ; } protected: int x, y ; }; class B : public A { public : int get_S() { return s ; }; void make_S() { s = x * y ; }; // 使用基类数据成员x,y protected: int s; }; class C : public B { public : void get_H() { cout << "Enter a number of h : " ; cin >> h ; } int get_V() { return v ; } void make_V() { make_S(); v = get_S() * h ; } // 使用基类成员函数 protected: int h, v; }; 华南理 大学计算机学院 周霭如 2009

#include<iostream> 例8 -1 公有继承的测试 using namespace std ; class A { public : void

#include<iostream> 例8 -1 公有继承的测试 using namespace std ; class A { public : void get_XY() { cout << "Enter two numbers of x, y : " ; cin >> x >> y ; } void put_XY() { cout << "x = "<< x << ", y = " << y << 'n' ; } protected: int x, y ; class A }; class B : public A { public : int get_S() { return s ; }; class B : public A void make_S() { s = x * y ; }; // 使用基类数据成员x,y protected: int s; }; class C : public B { public : void get_H() { cout << "Enter a number of h : " ; cin >> h ; } int get_V() { return v ; } void make_V() { make_S(); v = get_S() * h ; } // 使用基类成员函数 protected: int h, v; }; 8. 2. 1 华南理 大学计算机学院 周霭如 2009 访问控制

#include<iostream> 例8 -1 公有继承的测试 using namespace std ; class A { public : void

#include<iostream> 例8 -1 公有继承的测试 using namespace std ; class A { public : void get_XY() { cout << "Enter two numbers of x, y : " ; cin >> x >> y ; } void put_XY() { cout << "x = "<< x << ", y = " << y << 'n' ; } protected: int x, y ; 保护数据成员 class A }; 在类层次中可见 class B : public A { public : int get_S() { return s ; }; class B : public X void make_S() { s = x * y ; }; // 使用基类数据成员x,y protected: int s; }; class C : public Y class C : public B {public : void get_H() { cout << "Enter a number of h : " ; cin >> h ; } int get_V() { return v ; } void make_V() { make_S(); v = get_S() * h ; } // 使用基类成员函数 protected: int h, v; }; 8. 2. 1 华南理 大学计算机学院 周霭如 2009 访问控制

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ;

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ; 8. 2. 1 访问控制 C obj. C ; cout << "It is object_A : n" ; obj. A. get_XY() ; obj. A. put_XY() ; cout << "It is object_B : n" ; obj. B. get_XY() ; obj. B. make_S() ; cout << "S = " << obj. B. get_S() << endl ; cout << "It is object_C : n" ; obj. C. get_XY() ; obj. C. get_H(); obj. C. make_V() ; cout << "V = " << obj. C. get_V() << endl ; } 华南理 大学计算机学院 周霭如 2009

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ;

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ; C obj. C ; x 8. 2. 1 obj. A. x cout << "It is object_A : n" ; obj. A. get_XY() ; obj. A. put_XY() ; cout << "It is object_B : n" ; obj. B. get_XY() ; obj. B. make_S() ; cout << "S = " << obj. B. get_S() << endl ; cout << "It is object_C : n" ; obj. C. get_XY() ; obj. C. get_H(); obj. C. make_V() ; cout << "V = " << obj. C. get_V() << endl ; } 华南理 大学计算机学院 周霭如 2009 y 访问控制 obj. A. y

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ;

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ; C obj. C ; cout << "It is object_A : n" ; x 8. 2. 1 obj. A. x obj. B obj. A. put_XY() ; cout << "It is object_B : n" ; obj. B. get_XY() ; obj. B. make_S() ; cout << "S = " << obj. B. get_S() << endl ; cout << "It is object_C : n" ; obj. C. get_XY() ; obj. C. get_H(); obj. C. make_V() ; cout << "V = " << obj. C. get_V() << endl ; 华南理 大学计算机学院 周霭如 2009 obj. A. y s obj. A. get_XY() ; } y 访问控制 obj. B. x obj. B. y obj. B. s

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ;

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ; C obj. C ; cout << "It is object_A : n" ; x 8. 2. 1 y 访问控制 obj. A. x obj. A. y s obj. B. x obj. B. y obj. B. s obj. A. get_XY() ; obj. A. put_XY() ; obj. C cout << "It is object_B : n" ; obj. B. get_XY() ; obj. B. make_S() ; cout << "S = " << obj. B. get_S() << endl ; cout << "It is object_C : n" ; obj. C. get_XY() ; obj. C. get_H(); obj. C. make_V() ; cout << "V = " << obj. C. get_V() << endl ; } 华南理 大学计算机学院 周霭如 2009 obj. C. x obj. C. y obj. C. s h v obj. C. h obj. C. v

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ;

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ; C obj. C ; cout << "It is object_A : n" ; x 8. 2. 1 y 访问控制 obj. A. x obj. A. y s obj. B. x obj. B. y obj. B. s obj. A. get_XY() ; obj. A. put_XY() ; obj. C. x obj. C. y cout << "It is object_B : n" ; obj. B. get_XY() ; 对 obj. A 的 obj. B. make_S() ; 数据成员操作 cout << "S = " << obj. B. get_S() << endl ; cout << "It is object_C : n" ; obj. C. get_XY() ; obj. C. get_H(); obj. C. make_V() ; cout << "V = " << obj. C. get_V() << endl ; } 华南理 大学计算机学院 周霭如 2009 obj. C. s h v obj. C. h obj. C. v

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ;

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ; C obj. C ; cout << "It is object_A : n" ; x 8. 2. 1 y 访问控制 obj. A. x obj. A. y s obj. B. x obj. B. y obj. B. s obj. A. get_XY() ; obj. A. put_XY() ; obj. C. x obj. C. y obj. C. s cout << "It is object_B : n" ; obj. B. get_XY() ; obj. B. make_S() ; cout << "S = " << obj. B. get_S() << endl ; cout << "It is object_C : n" ; obj. C. get_XY() ; obj. C. get_H(); obj. C. make_V() ; cout << "V = " << obj. C. get_V() << endl ; } 华南理 大学计算机学院 周霭如 2009 调用基类A成员函数 对 obj. B 的数据成员操作 h v obj. C. h obj. C. v

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ;

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ; C obj. C ; cout << "It is object_A : n" ; x 8. 2. 1 y 访问控制 obj. A. x obj. A. y s obj. B. x obj. B. y obj. B. s obj. A. get_XY() ; obj. A. put_XY() ; obj. C. x obj. C. y obj. C. s cout << "It is object_B : n" ; obj. B. get_XY() ; obj. B. make_S() ; cout << "S = " << obj. B. get_S() << endl ; cout << "It is object_C : n" ; obj. C. get_XY() ; obj. C. get_H(); obj. C. make_V() ; cout << "V = " << obj. C. get_V() << endl ; } 华南理 大学计算机学院 周霭如 2009 调用派生类B成员函数 对 obj. B 的数据成员操作 h v obj. C. h obj. C. v

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ;

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ; C obj. C ; cout << "It is object_A : n" ; x 8. 2. 1 y 访问控制 obj. A. x obj. A. y s obj. B. x obj. B. y obj. B. s h v obj. C. h obj. C. v obj. A. get_XY() ; obj. A. put_XY() ; obj. C. x obj. C. y obj. C. s cout << "It is object_B : n" ; obj. B. get_XY() ; obj. B. make_S() ; cout << "S = " << obj. B. get_S() << endl ; cout << "It is object_C : n" ; obj. C. get_XY() ; obj. C. get_H(); obj. C. make_V() ; cout << "V = " << obj. C. get_V() << endl ; } 华南理 大学计算机学院 周霭如 2009 调用基类A成员函数 对 obj. C 的数据成员操作

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ;

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ; C obj. C ; cout << "It is object_A : n" ; x 8. 2. 1 y 访问控制 obj. A. x obj. A. y s obj. B. x obj. B. y obj. B. s h v obj. C. h obj. C. v obj. A. get_XY() ; obj. A. put_XY() ; obj. C. x obj. C. y obj. C. s cout << "It is object_B : n" ; obj. B. get_XY() ; obj. B. make_S() ; cout << "S = " << obj. B. get_S() << endl ; cout << "It is object_C : n" ; obj. C. get_XY() ; obj. C. get_H(); obj. C. make_V() ; cout << "V = " << obj. C. get_V() << endl ; } 华南理 大学计算机学院 周霭如 2009 调用派生类C成员函数 对 obj. C 的数据成员操作

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ;

int main() 例8 -1 公有继承的测试 { A obj. A ; B obj. B ; C obj. C ; cout << "It is object_A : n" ; x 8. 2. 1 y 访问控制 obj. A. x obj. A. y s obj. B. x obj. B. y obj. B. s obj. A. get_XY() ; obj. A. put_XY() ; obj. C. x cout << "It is object_B : n" ; obj. B. get_XY() ; obj. B. make_S() ; cout << "S = " << obj. B. get_S() << endl ; cout << "It is object_C : n" ; obj. C. get_XY() ; obj. C. get_H(); obj. C. make_V() ; cout << "V = " << obj. C. get_V() << endl ; } 华南理 大学计算机学院 周霭如 2009 obj. C. y obj. C. s h v obj. C. h obj. C. v

#include<iostream> 例8 -2 私有继承的测试 using namespace std ; class A { public : void

#include<iostream> 例8 -2 私有继承的测试 using namespace std ; class A { public : void get_XY() { cout << "Enter two numbers of x and y : "class ; cin. A>> x >> y ; } void put_XY() { cout << "x = "<< x << ", y = " << y << 'n' ; } protected: int x, y ; class B : private A }; class B : private A { public : int get_S() { return s ; } void make_S() { get_XY(); s = x * y ; } private: int s ; }; int main() { B obj. B ; private成员 cout << "It is object_B : n" ; obj. B. make_S() ; obj. B. x obj. B. y obj. B. s cout << "S = " << obj. B. get_S() << endl ; } 8. 2. 1 华南理 大学计算机学院 周霭如 2009 访问控制

#include<iostream> 例8 -2 私有继承的测试 using namespace std ; class A { public : void

#include<iostream> 例8 -2 私有继承的测试 using namespace std ; class A { public : void get_XY() { cout << "Enter two numbers of x and y : " ; class cin >>Ax >> y ; } void put_XY() { cout << "x = "<< x << ", y = " << y << 'n' ; } protected: int x, y ; 调用基类成员函数 }; class B : private A { public : int get_S() { return s ; } void make_S() { get_XY(); s = x * y ; } private: int s ; }; int main() { B obj. B ; cout << "It is object_B : n" ; private成员 obj. B. make_S() ; cout << "S = " << obj. B. get_S() << endl ; obj. B. x obj. B. y obj. B. s } 8. 2. 1 华南理 大学计算机学院 周霭如 2009 访问控制

#include<iostream> 例8 -2 私有继承的测试 using namespace std ; class A { public : void

#include<iostream> 例8 -2 私有继承的测试 using namespace std ; class A { public : void get_XY() { cout << "Enter two numbers of x and y : " ; class cin >>Ax >> y ; } void put_XY() { cout << "x = "<< x << ", y = " << y << 'n' ; } protected: int x, y ; }; class B : private A { public : int get_S() { return s ; } void make_S() { get_XY(); s = x * y ; } private: int s ; }; int main() 访问私有数据成员 { B obj. B ; cout << "It is object_B : n" ; private成员 obj. B. make_S() ; cout << "S = " << obj. B. get_S() << endl ; obj. B. x obj. B. y obj. B. s } 8. 2. 1 华南理 大学计算机学院 周霭如 2009 访问控制

#include<iostream> 例8 -2 私有继承的测试 using namespace std ; class A { public : void

#include<iostream> 例8 -2 私有继承的测试 using namespace std ; class A { public : void get_XY() { cout << "Enter two numbers of x and y : "class ; cin. A>> x >> y ; } void put_XY() { cout << "x = "<< x << ", y = " << y << 'n' ; } protected: int x, y ; class B : private A }; class B : private A { public : int get_S() { return s ; } void make_S() { get_XY(); s = x * y ; } private: int s ; }; int main() { B obj. B ; private成员 cout << "It is object_B : n" ; obj. B. make_S() ; obj. B. x obj. B. y obj. B. s cout << "S = " << obj. B. get_S() << endl ; } 8. 2. 1 华南理 大学计算机学院 周霭如 2009 访问控制

#include<iostream> 例8 -3 私有数据成员的测试 using namespace std ; class A { public: A(){ x=1;

#include<iostream> 例8 -3 私有数据成员的测试 using namespace std ; class A { public: A(){ x=1; } int out() {return x ; } class A void add. X() { x++; } private: int x ; }; class B : public A { public: B(){ y=1; } int out() {return y ; } void add. Y() { y++; } 基类的私有数据成员 private: int y ; }; 不能在派生类中直接访问 int main() 但派生类对象建立私有数据空间 {Aa; cout << "a. x=" << a. out() << endl ; Bb; a. x b. add. X() ; b. add. Y() ; cout << "b. x=" << b. A: : out() << endl ; b. x b. y cout << "b. y=" << b. out() << endl ; } 8. 2. 1 华南理 大学计算机学院 周霭如 2009 访问控制

#include<iostream> using namespace std ; class A { public: A(){ x=1; } int out()

#include<iostream> using namespace std ; class A { public: A(){ x=1; } int out() {return x ; } void add. X() { x++; } private: int x ; }; class B : public A { public: B(){ y=1; } int out() {return y ; } void add. Y() { y++; } private: int y ; }; int main() {Aa; cout << "a. x=" << a. out() << endl ; Bb; b. add. X() ; b. add. Y() ; cout << "b. x=" << b. A: : out() << endl ; cout << "b. y=" << b. out() << endl ; } 华南理 大学计算机学院 周霭如 2009 例8 -3 私有数据成员的测试 8. 2. 1 访问控制 class A class B : public A a. x b. y

#include<iostream> using namespace std ; class A { public: A(){ x=1; } int out()

#include<iostream> using namespace std ; class A { public: A(){ x=1; } int out() {return x ; } void add. X() { x++; } private: int x ; }; class B : public A 调用构造函数 { public: B(){ y=1; } 对数据成员赋值 int out() {return y ; } void add. Y() { y++; } private: int y ; }; int main() {Aa; cout << "a. x=" << a. out() << endl ; Bb; b. add. X() ; b. add. Y() ; cout << "b. x=" << b. A: : out() << endl ; cout << "b. y=" << b. out() << endl ; } 华南理 大学计算机学院 周霭如 2009 例8 -3 私有数据成员的测试 8. 2. 1 访问控制 class A class B : public A a. x b. x 1 b. y

#include<iostream> 例8 -3 私有数据成员的测试 using namespace std ; class A { public: A(){ x=1;

#include<iostream> 例8 -3 私有数据成员的测试 using namespace std ; class A { public: A(){ x=1; } int out() {return x ; } class A void add. X() { x++; } private: int x ; }; 创建派生类对象 class B : public A { public: B(){ y=1; } 调用基类 派生类构造函数 int out() {return y ; } b. x = 1 b. y = 1 void add. Y() { y++; } private: int y ; }; int main() {Aa; cout << "a. x=" << a. out() << endl ; Bb; 1 a. x b. add. X() ; b. add. Y() ; cout << "b. x=" << b. A: : out() << endl ; b. x 1 1 b. y cout << "b. y=" << b. out() << endl ; } 8. 2. 1 华南理 大学计算机学院 周霭如 2009 访问控制

#include<iostream> 例8 -3 私有数据成员的测试 using namespace std ; class A { public: A(){ x=1;

#include<iostream> 例8 -3 私有数据成员的测试 using namespace std ; class A { public: A(){ x=1; } int out() {return x ; } class A void add. X() { x++; } private: int x ; }; class B : public A 调用基类公有成员函数 class B : public A { public: B(){ y=1; } b. x ++ int out() {return y ; } void add. Y() { y++; } private: int y ; }; int main() {Aa; cout << "a. x=" << a. out() << endl ; Bb; 1 a. x b. add. X() ; b. add. Y() ; cout << "b. x=" << b. A: : out() << endl ; b. x 2 1 b. y cout << "b. y=" << b. out() << endl ; } 8. 2. 1 华南理 大学计算机学院 周霭如 2009 访问控制

#include<iostream> 例8 -3 私有数据成员的测试 using namespace std ; class A { public: A(){ x=1;

#include<iostream> 例8 -3 私有数据成员的测试 using namespace std ; class A { public: A(){ x=1; } int out() {return x ; } class A void add. X() { x++; } private: int x ; }; class B : public A 调用派生类公有成员函数 class B : public A { public: B(){ y=1; } b. y ++ int out() {return y ; } void add. Y() { y++; } private: int y ; }; int main() {Aa; cout << "a. x=" << a. out() << endl ; Bb; 1 a. x b. add. X() ; b. add. Y() ; cout << "b. x=" << b. A: : out() << endl ; b. x 2 2 b. y cout << "b. y=" << b. out() << endl ; } 8. 2. 1 华南理 大学计算机学院 周霭如 2009 访问控制

#include<iostream> using namespace std ; class A { public: A(){ x=1; } int out()

#include<iostream> using namespace std ; class A { public: A(){ x=1; } int out() {return x ; } void add. X() { x++; } private: int x ; }; class B : public A { public: B(){ y=1; } int out() {return y ; } void add. Y() { y++; } private: int y ; }; int main() {Aa; cout << "a. x=" << a. out() << endl ; Bb; b. add. X() ; b. add. Y() ; cout << "b. x=" << b. A: : out() << endl ; cout << "b. y=" << b. out() << endl ; } 华南理 大学计算机学院 周霭如 2009 例8 -3 私有数据成员的测试 8. 2. 1 访问控制 class A 调用基类版本同名函数 class B : public A 返回 b. x 的值 a. x 1 b. x 2 b. y 2

访问控制 华南理 大学计算机学院 周霭如 2009 8. 2. 1 #include<iostream> using namespace std ; class

访问控制 华南理 大学计算机学院 周霭如 2009 8. 2. 1 #include<iostream> using namespace std ; class A { public: A(){ x=1; } int out() {return x ; } void add. X() { x++; } private: int x ; }; class B : public A { public: B(){ y=1; } int out() {return y ; } void add. Y() { y++; } private: int y ; }; int main() {Aa; cout << "a. x=" << a. out() << endl ; Bb; b. add. X() ; b. add. Y() ; cout << "b. x=" << b. A: : out() << endl ; cout << "b. y=" << b. out() << endl ; } 例8 -3 私有数据成员的测试 class A class B : public A 调用派生类版本同名函数 返回 b. y 的值 a. x 1 b. x 2 b. y 2

1. 重名数据成员 8. 2. 2 例: class base { public : int a ,

1. 重名数据成员 8. 2. 2 例: class base { public : int a , b ; }; class derived : public base { public : int b , c ; }; void f () { derived d ; d. a=1; d. base : : b = 2 ; d. b=3; d. c=4; }; 华南理 大学计算机学院 周霭如 2009 重名成员 base a b derived a b b c

1. 重名数据成员 8. 2. 2 例: class base { public : int a ,

1. 重名数据成员 8. 2. 2 例: class base { public : int a , b ; }; class derived : public base { public : int b , c ; }; void f () { derived d ; d. a=1; d. base : : b = 2 ; d. b=3; d. c=4; }; 华南理 大学计算机学院 周霭如 2009 重名成员 base a b derived d b c

1. 重名数据成员 8. 2. 2 例: class base { public : int a ,

1. 重名数据成员 8. 2. 2 例: class base { public : int a , b ; }; class derived : public base { public : int b , c ; }; void f () { derived d ; d. a=1; d. base : : b = 2 ; d. b=3; d. c=4; }; 华南理 大学计算机学院 周霭如 2009 重名成员 base a b derived d 1 访问从base 类继承 的数据成员a b c

1. 重名数据成员 8. 2. 2 例: class base { public : int a ,

1. 重名数据成员 8. 2. 2 例: class base { public : int a , b ; }; class derived : public base { public : int b , c ; }; void f () { derived d ; d. a=1; d. base : : b = 2 ; d. b=3; d. c=4; }; 华南理 大学计算机学院 周霭如 2009 重名成员 base a b derived a b 1 2 derived d 访问从base 类 继承的 b b c

1. 重名数据成员 8. 2. 2 例: class base { public : int a ,

1. 重名数据成员 8. 2. 2 例: class base { public : int a , b ; }; class derived : public base { public : int b , c ; }; void f () { derived d ; d. a=1; d. base : : b = 2 ; d. b=3; d. c=4; }; 华南理 大学计算机学院 周霭如 2009 重名成员 base a b derived a b b 1 2 3 derived d 访问derived 类定义 的数据成员b c

1. 重名数据成员 8. 2. 2 例: class base { public : int a ,

1. 重名数据成员 8. 2. 2 例: class base { public : int a , b ; }; class derived : public base { public : int b , c ; }; void f () { derived d ; d. a=1; d. base : : b = 2 ; d. b=3; d. c=4; }; 华南理 大学计算机学院 周霭如 2009 重名成员 base a b derived a b b c 1 2 3 4 derived d 访问derived 类 定义的数据成员c

8. 2. 2 重名成员 #include<iostream> //例8 -4 2. 重名成员函数 using namespace std ; class

8. 2. 2 重名成员 #include<iostream> //例8 -4 2. 重名成员函数 using namespace std ; class A { public: int a 1, a 2 ; A( int i 1=0, int i 2=0 ) { a 1 = i 1; a 2 = i 2; } voidprint() cout << <<<< a 1 << << a 2 << ; } endl ; } {{ cout <<"a 1=" a 1 't' <<<< 't'"a 2=" <<endl a 2 << }; class B : public A { public: int b 1, b 2 ; B( int j 1=1, int j 2=1 ) { b 1 = j 1; b 2 = j 2; } void print() //定义同名函数 {{ cout << <<<< b 1 << << b 2 << ; } endl ; } <<"b 1=" b 1 't' <<<< 't'"b 2=" <<endl b 2 << void print. AB() { A: : print() ; //派生类对象调用基类版本同名成员函数 print() ; //派生类对象调用自身的成员函数 } }; int main() {B b; b. A: : print(); b. print. AB(); } 华南理 大学计算机学院 周霭如 2009

#include<iostream> //例8 -4 2. 重名成员函数 using namespace std ; class A { public: int

#include<iostream> //例8 -4 2. 重名成员函数 using namespace std ; class A { public: int a 1, a 2 ; A( int i 1=0, int i 2=0 ) { a 1 = i 1; a 2 = i 2; } voidprint() cout << <<<< a 1 << << a 2 << ; } endl ; } {{ cout <<"a 1=" a 1 't' <<<< 't'"a 2=" <<endl a 2 << }; class B : public A 基类this指针 { public: 指向派生类对象 int b 1, b 2 ; B( int j 1=1, int j 2=1 ) { b 1 = j 1; b 2 = j 2; } void print() //定义同名函数 {{ cout << <<<< b 1 << << b 2 << ; } endl ; } <<"b 1=" b 1 't' <<<< 't'"b 2=" <<endl b 2 << void print. AB() { A: : print() ; //派生类对象调用基类版本同名成员函数 print() ; //派生类对象调用自身的成员函数 } }; int main() {B b; b. A: : print(); b. print. AB(); } 8. 2. 2 华南理 大学计算机学院 周霭如 2009 重名成员

8. 2. 2 重名成员 #include<iostream> //例8 -4 2. 重名成员函数 using namespace std ; class

8. 2. 2 重名成员 #include<iostream> //例8 -4 2. 重名成员函数 using namespace std ; class A { public: int a 1, a 2 ; A( int i 1=0, int i 2=0 ) { a 1 = i 1; a 2 = i 2; } void print() { cout << "a 1=" << a 1 << 't' << "a 2=" << a 2 << endl ; } }; class B : public A { public: int b 1, b 2 ; B( int j 1=1, int j 2=1 ) { b 1 = j 1; b 2 = j 2; } void print() //定义同名函数 { cout << "b 1=" << b 1 << 't' << "b 2=" << b 2 << endl ; } void print. AB() { A: : print() ; //派生类对象调用基类版本同名成员函数 print() ; //派生类对象调用自身的成员函数 } }; int main() {B b; b. A: : print(); b. print. AB(); } 华南理 大学计算机学院 周霭如 2009

#include<iostream> //例8 -4 2. 重名成员函数 using namespace std ; class A { public: int

#include<iostream> //例8 -4 2. 重名成员函数 using namespace std ; class A { public: int a 1, a 2 ; A( int i 1=0, int i 2=0 ) { a 1 = i 1; a 2 = i 2; } void print() { cout << "a 1=" << a 1 << 't' << "a 2=" << a 2 << endl ; } }; class B : public A { public: int b 1, b 2 ; B( int j 1=1, int j 2=1 ) { b 1 = j 1; b 2 = j 2; } void print() //定义同名函数 { cout << "b 1=" << b 1 << 't' << "b 2=" << b 2 << endl ; } void print. AB() { A: : print() ; //派生类对象调用基类版本同名成员函数 print() ; //派生类对象调用自身的成员函数 } }; int main() {B b; b. A: : print(); b. print. AB(); } 8. 2. 2 华南理 大学计算机学院 周霭如 2009 重名成员

#include<iostream> //例8 -4 2. 重名成员函数 using namespace std ; class A { public: int

#include<iostream> //例8 -4 2. 重名成员函数 using namespace std ; class A { public: int a 1, a 2 ; A( int i 1=0, int i 2=0 ) { a 1 = i 1; a 2 = i 2; } void print() { cout << "a 1=" << a 1 << 't' << "a 2=" << a 2 << endl ; } }; class B : public A { public: int b 1, b 2 ; B( int j 1=1, int j 2=1 ) { b 1 = j 1; b 2 = j 2; } void print() //定义同名函数 { cout << "b 1=" << b 1 << 't' << "b 2=" << b 2 << endl ; } void print. AB() { A: : print() ; //派生类对象调用基类版本同名成员函数 print() ; //派生类对象调用自身的成员函数 } }; int main() {B b; b. A: : print(); b. print. AB(); } 8. 2. 2 华南理 大学计算机学院 周霭如 2009 重名成员

#include<iostream> //例8 -4 2. 重名成员函数 using namespace std ; class A { public: int

#include<iostream> //例8 -4 2. 重名成员函数 using namespace std ; class A { public: int a 1, a 2 ; A( int i 1=0, int i 2=0 ) { a 1 = i 1; a 2 = 通过继承,类B具有两个同名成员函数 i 2; } void print() { cout << "a 1=" << a 1 << 't' << "a 2=" << a 2 << endl } print( A * this ); // ; void A: : print(); }; void B: : print(); // void print( B * this ); class B : public A { public: int b 1, b 2 ; B( int j 1=1, int j 2=1 ) { b 1 = j 1; b 2 = j 2; } void print() //定义同名函数 { cout << "b 1=" << b 1 << 't' << "b 2=" << b 2 << endl ; } void print. AB() { A: : print() ; //派生类对象调用基类版本同名成员函数 print() ; //派生类对象调用自身的成员函数 } }; int main() {B b; b. A: : print(); b. print. AB(); } 8. 2. 2 华南理 大学计算机学院 周霭如 2009 重名成员

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class. BB { public: static void

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class. BB { public: static void Add() { i++ ; } static int i; void out() { cout<<"static i="<<i<<endl; } }; int B: : i=0; class B B class. DD: private { public: void f() { i=5; Add(); B: : i++; B: : Add(); } }; 华南理 大学计算机学院 周霭如 2009 int main() { B x; D y; x. Add(); x. out(); y. f(); cout<<"static i="<<B: : i<<endl; cout<<"static i="<<x. i<<endl; //cout<<"static i="<<y. i<<endl; }

//例8 -5 在派生类中访问静态成员 #include<iostream> 静态成员函数 using namespace std ; class B int main() {

//例8 -5 在派生类中访问静态成员 #include<iostream> 静态成员函数 using namespace std ; class B int main() { public: { B x; D y; static { i++ ; } staticvoid. Add() { i++ static int i; x. Add(); void out() { cout<<"static i="<<i<<endl; } x. out(); }; int B: : i=0; y. f(); class D : private B cout<<"static i="<<B: : i<<endl; { public: void f() cout<<"static i="<<x. i<<endl; { i=5; //cout<<"static i="<<y. i<<endl; Add(); } B: : i++; B: : Add(); } }; 华南理 大学计算机学院 周霭如 2009

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; 静态数据成员 class B int main() {

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; 静态数据成员 class B int main() { public: { B x; D y; static void Add() { i++ ; } staticint inti; i; x. Add(); void out() { cout<<"static i="<<i<<endl; } x. out(); }; int B: : i=0; y. f(); class D : private B cout<<"static i="<<B: : i<<endl; { public: void f() cout<<"static i="<<x. i<<endl; { i=5; //cout<<"static i="<<y. i<<endl; Add(); } B: : i++; B: : Add(); } }; 华南理 大学计算机学院 周霭如 2009

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B int main() { public:

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B int main() { public: { B x; D y; static void Add() { i++ ; } static int i; x. Add(); void out() { cout<<"static i="<<i<<endl; } x. out(); }; i 是类D的私有静态数据成员 int B: : i=0; y. f(); 类中可见 class D : private B cout<<"static i="<<B: : i<<endl; { public: void f() cout<<"static i="<<x. i<<endl; { i=5; //cout<<"static i="<<y. i<<endl; Add(); } B: : i++; B: : Add(); } }; 华南理 大学计算机学院 周霭如 2009

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B int main() { public:

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B int main() { public: { B x; D y; static void Add() { i++ ; } static int i; x. Add(); void out() { cout<<"static i="<<i<<endl; } x. out(); }; Add()是类D的私有静态成员函数 int B: : i=0; y. f(); 类中可调用 class D : private B cout<<"static i="<<B: : i<<endl; { public: void f() cout<<"static i="<<x. i<<endl; { i=5; //cout<<"static i="<<y. i<<endl; Add(); } B: : i++; B: : Add(); } }; 华南理 大学计算机学院 周霭如 2009

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B int main() { public:

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B int main() { public: { B x; D y; static void Add() { i++ ; } static int i; x. Add(); void out() { cout<<"static i="<<i<<endl; } x. out(); }; int B: : i=0; y. f(); 访问B类的静态成员 class D : private B cout<<"static i="<<B: : i<<endl; { public: void f() cout<<"static i="<<x. i<<endl; { i=5; //cout<<"static i="<<y. i<<endl; Add(); } B: : i++; B: : Add(); } }; 华南理 大学计算机学院 周霭如 2009

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B { public: static void

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B { public: static void Add() { i++ ; } 访问B类的静态数据成员 static int i; void out() { cout<<"static i="<<i<<endl; } }; int B: : i=0; class D : private B { public: void f() { i=5; Add(); B: : i++; B: : Add(); } }; 华南理 大学计算机学院 周霭如 2009 int main() { B x; D y; x. Add(); x. out(); y. f(); cout<<"static cout <<"statici="<<B: : i<<endl; cout<<"static i="<<x. i<<endl; //cout<<"static i="<<y. i<<endl; }

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B int main() { public:

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B int main() { public: { B x; D y; static void Add() { i++ ; } 通过B类对象访问 x. Add(); static int i; void out() { cout<<"static i="<<i<<endl; } 静态数据成员 x. out(); }; int B: : i=0; y. f(); class D : private B cout<<"static i="<<B: : i<<endl; { public: void f() cout<<"static cout <<"statici="<<x. i<<endl; { i=5; //cout<<"static i="<<y. i<<endl; Add(); } B: : i++; B: : Add(); } }; 华南理 大学计算机学院 周霭如 2009

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B { public: static void

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B { public: static void Add() { i++ ; } static int i; void out() { cout<<"static i="<<i<<endl; } 错误, i 是类D的私有 }; 静态数据成员 int B: : i=0; class D : private B { public: void f() { i=5; Add(); B: : i++; B: : Add(); } }; 华南理 大学计算机学院 周霭如 2009 int main() { B x; D y; x. Add(); x. out(); y. f(); cout<<"static i="<<B: : i<<endl; cout<<"static i="<<x. i<<endl; i="<<y. i<<endl; ////cout<<"static i="<<y. i<<endl; }

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B { public: static void

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B { public: static void Add() { i++ ; } static int i; void out() { cout<<"static i="<<i<<endl; } }; int B: : i=0; class D : private B { public: void f() { i=5; Add(); B: : i++; B: : Add(); } }; 华南理 大学计算机学院 周霭如 2009 int main() { B x; D y; x. Add(); x. out(); y. f(); cout<<"static i="<<B: : i<<endl; cout<<"static i="<<x. i<<endl; //cout<<"static i="<<y. i<<endl; }

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B { public: static void

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B { public: static void Add() { i++ ; } static int i; void out() { cout<<"static i="<<i<<endl; } }; int B: : i=0; class D : private B { public: void f(); { i=5; Add(); B: : i++; B: : Add(); } }; 华南理 大学计算机学院 周霭如 2009 int main() { B x; D y; x. Add(); x. out(); y. f(); cout<<"static i="<<B: : i<<endl; cout<<"static i="<<x. i<<endl; //cout<<"static i="<<y. i<<endl; }

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B { public: static void

//例8 -5 在派生类中访问静态成员 #include<iostream> using namespace std ; class B { public: static void Add() { i++ ; } static int i; void out() { cout<<"static i="<<i<<endl; } }; int B: : i=0; class D : private B { public: void f(); { i=5; Add(); B: : i++; B: : Add(); } }; 华南理 大学计算机学院 周霭如 2009 int main() { B x; D y; x. Add(); x. out(); y. f(); cout<<"static i="<<B: : i<<endl; cout<<"static i="<<x. i<<endl; //cout<<"static i="<<y. i<<endl; }

// 例8 -6 调用构造函数顺序测试,构造函数无参数 8. 3 基类的初始化 #include<iostream> using namespace std ; class Base

// 例8 -6 调用构造函数顺序测试,构造函数无参数 8. 3 基类的初始化 #include<iostream> using namespace std ; class Base { public : Base ( ) { cout << "Base created. n" ; } }; class D_class : public Base { public : D_class ( ) { cout << "D_class created. n" ; } }; int main ( ) { D_class d 1 ; } 华南理 大学计算机学院 周霭如 2009

// 例8 -6 调用构造函数顺序测试,构造函数无参数 8. 3 基类的初始化 #include<iostream> using namespace std ; class Base

// 例8 -6 调用构造函数顺序测试,构造函数无参数 8. 3 基类的初始化 #include<iostream> using namespace std ; class Base { public : Base ( ) { cout << "Base created. n" ; } }; class D_class : public Base { public : D_class ( ) { cout << "D_class created. n" ; } }; int main ( ) { D_class d 1 ; } 华南理 大学计算机学院 周霭如 2009

// 例8 -6 调用构造函数顺序测试,构造函数无参数 8. 3 基类的初始化 #include<iostream> using namespace std ; class Base

// 例8 -6 调用构造函数顺序测试,构造函数无参数 8. 3 基类的初始化 #include<iostream> using namespace std ; class Base { public : Base ( ) { cout << "Base created. n" ; } }; ① 调用基类构造函数 class D_class : public Base { public : D_class ( ) { cout << "D_class created. n" ; } }; int main ( ) { D_class d 1 ; } 华南理 大学计算机学院 周霭如 2009

// 例8 -6 调用构造函数顺序测试,构造函数无参数 8. 3 基类的初始化 #include<iostream> using namespace std ; class Base

// 例8 -6 调用构造函数顺序测试,构造函数无参数 8. 3 基类的初始化 #include<iostream> using namespace std ; class Base { public : Base ( ) { cout << "Base created. n" ; } }; class D_class : public Base ② 调用派生类构造函数 { public : D_class ( ) { cout << "D_class created. n" ; } }; int main ( ) { D_class d 1 ; } 华南理 大学计算机学院 周霭如 2009

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } int inc 1 () { return ++ data 1; } int inc 2 () { return ++ data 2 ; } void display () {cout << "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } }; class derived_class : private parent_class { int data 3 ; parent_class data 4 ; public: derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) { data 3 = p 5 ; } int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } int inc 3 ( ) { return ++ data 3 ; } void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; cout << "data 3=" << data 3 << endl ; } }; int main ( ) { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 华南理 大学计算机学院 周霭如 2009 基类的初始化

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; data 1 ; public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } int inc 1 () { return ++ data 1; } int inc 2 () { return ++ data 2 ; } void display () {cout << "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } }; class derived_class : private parent_class { int data 3 ; parent_class data 4 ; parent_class public: derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) { data 3 = p 5 ; } int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } int inc 3 ( ) { return ++ data 3 ; } void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; cout << "data 3=" << data 3 << endl ; } parent_class data 1 data 2 }; int main ( ) data 4 { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class , data 2 ;

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class , data 2 ; {{ intintdata 1 , data 2 ; public: : parent_class ( int (p 1 int , intp 1 p 2, )int { data 1 data 2 = = p 2; parent_class p 2 =) p 1; { data 1 p 1; } data 2 = p 2; } int () { () return ++ data 1; } intinc 1 { return ++ data 1; } int inc 2 () { return ++ data 2 ; } void display () {cout << "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } void display() }; { cout<<"data 1="<<data 1<<" , data 2="<<data 2<<endl ; } class derived_class : private parent_class 基类有一个 }; { int data 3 ; parent_class data 4 ; 参数化的构造函数 public: derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) { data 3 = p 5 ; } int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } int inc 3 ( ) { return ++ data 3 ; } void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; cout << "data 3=" << data 3 << endl ; } parent_class data 1 data 2 }; int main ( ) data 4 { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

8. 3 基类的初始化 #include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class ,

8. 3 基类的初始化 #include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class , data 2 ; {{ intintdata 1 , data 2 ; public: : parent_class ( int( p 1 ) { data 1 data 2 p 2; data 2 } parent_class int, int p 1 p 2 , int p 2 ) ={ p 1; data 1 = =p 1; = p 2; } int inc 1 () { return ++ data 1; } int inc 2 () { return ++ data 2 ; } void display () {cout << "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } void display() }; { cout<<"data 1="<<data 1<<" , data 2="<<data 2<<endl ; } class derived_class : private parent_class }; { int data 3 ; 成员函数 parent_class data 4 ; 数据成员自增 public: derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) { data 3 = p 5 ; } int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } int inc 3 ( ) { return ++ data 3 ; } void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; cout << "data 3=" << data 3 << endl ; } parent_class data 1 data 2 }; int main ( ) data 4 { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } classintderived_class : private inc 1 () { return ++ data 1; } parent_class int inc 2 () {; return ++ data 2 ; } { int data 3 void display () {cout parent_class data 4<<; "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } }; public: class derived_class : private parent_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ) { derived_class int data 3 ; : parent_class data 4 ; ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) public: { data 3 = p 5 ; } derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } { data 3 = p 5 ; } int inc 3 ( ) { return ++ data 3 ; } int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } void display ( ) ++ data 3 ; } int inc 3 ( ) { return void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; { parent_class : : display<< ( ) ; data 3 data 4. display cout << "data 3=" << endl( ); ; cout << "data 3=" << data 3 << endl ; } } }}; ; parent_class data 1 data 2 int main ( ) data 4 { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; public : 类成员 parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } classintderived_class : private inc 1 () { return ++ data 1; } parent_class int inc 2 () {; return ++ data 2 ; } { int data 3 void display () {cout << "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } parent_class data 4 ; }; public: class derived_class : private parent_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ) { derived_class int data 3 ; : parent_class data 4 ; ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) public: { data 3 = p 5 ; } derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } { data 3 = p 5 ; } int inc 3( )( {)return { return ++ data 3 ; } (); } int inc 1 parent_class : : inc 1 void display ( ) ++ data 3 ; } int inc 3 ( ) { return void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; { parent_class : : display<< ( ) ; data 3 data 4. display cout << "data 3=" << endl( ); ; cout << "data 3=" << data 3 << endl ; } } }}; ; parent_class data 1 data 2 int main ( ) data 4 { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; 派生类构造函数 public : 有5个参数 parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } classintderived_class : private inc 1 () { return ++ data 1; } parent_class int inc 2 () {; return ++ data 2 ; } { int data 3 void display () {cout parent_class data 4<<; "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } }; public: class derived_class : private parent_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ) { derived_class int data 3 ; : parent_class data 4 ; ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) public: { data 3 = p 5 ; } derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } { data 3 = p 5 ; } int inc 3( )( {)return { return ++ data 3 ; } (); } int inc 1 parent_class : : inc 1 void display ( ) ++ data 3 ; } int inc 3 ( ) { return void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; { parent_class : : display<< ( ) ; data 3 data 4. display cout << "data 3=" << endl( ); ; cout << "data 3=" << data 3 << endl ; } } }}; ; parent_class data 1 data 2 int main ( ) data 4 { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; 调用基类构造函数 public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } classintderived_class : private inc 1 () { return ++ data 1; } parent_class int inc 2 () {; return ++ data 2 ; } { int data 3 void display () {cout parent_class data 4<<; "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } }; public: class derived_class : private parent_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ) { derived_class int data 3 ; : parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) parent_class data 4 ; public: { data 3 = p 5 ; } derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } { data 3 = p 5 ; } int inc 3( )( {)return { return ++ data 3 ; } (); } int inc 1 parent_class : : inc 1 void display ( ) ++ data 3 ; } int inc 3 ( ) { return void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; { parent_class : : display<< ( ) ; data 3 data 4. display cout << "data 3=" << endl( ); ; cout << "data 3=" << data 3 << endl ; } } }}; ; parent_class data 1 data 2 int main ( ) data 4 { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } classintderived_class : private 构造对象成员 inc 1 () { return ++ data 1; } parent_class int inc 2 () {; return ++ data 2 ; } { int data 3 void display () {cout << "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } parent_class data 4 ; }; public: class derived_class : private parent_class (int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ) { derived_class int data 3 ; : parent_class data 4 ; ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) public: { data 3 = p 5 ; } derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } { data 3 = p 5 ; } int inc 3( )( {)return { return ++ data 3 ; } (); } int inc 1 parent_class : : inc 1 void display ( ) ++ data 3 ; } int inc 3 ( ) { return void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; { parent_class : : display<< ( ) ; data 3 data 4. display cout << "data 3=" << endl( ); ; cout << "data 3=" << data 3 << endl ; } } }}; ; parent_class data 1 data 2 int main ( ) data 4 { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; 对自身数据成员赋值 public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } classintderived_class : private inc 1 () { return ++ data 1; } parent_class int inc 2 () {; return ++ data 2 ; } { int data 3 void display () {cout parent_class data 4<<; "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } }; public: class derived_class : private parent_class (int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ) { derived_class int data 3 ; : parent_class data 4 ; ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) public: { data 3 = p 5 ; } derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } { data 3 = p 5 ; } int inc 3( )( {)return { return ++ data 3 ; } (); } int inc 1 parent_class : : inc 1 void display ( ) ++ data 3 ; } int inc 3 ( ) { return void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; { parent_class : : display<< ( ) ; data 3 data 4. display cout << "data 3=" << endl( ); ; cout << "data 3=" << data 3 << endl ; } } }}; ; parent_class data 1 data 2 int main ( ) data 4 { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } classintderived_class : private inc 1 () { return ++ data 1; } parent_class int inc 2 () {; return ++ data 2 ; } { int data 3 调用基类版本的 void display () {cout } parent_class data 4<<; "data 1=" << data 1 << " , data 2=" << data 2 << endl ; 成员函数 }; public: class derived_class : private parent_class (int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ) { derived_class int data 3 ; : parent_class data 4 ; ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) public: { data 3 = p 5 ; } derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } { data 3 = p 5 ; } int inc 3( )( {)return { return ++ data 3 ; } (); } int inc 1 parent_class : : inc 1 void display ( ) ++ data 3 ; } int inc 3 ( ) { return void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; { parent_class : : display<< ( ) ; data 3 data 4. display cout << "data 3=" << endl( ); ; cout << "data 3=" << data 3 << endl ; } } }}; ; parent_class data 1 data 2 int main ( ) data 4 { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } classintderived_class : private inc 1 () { return ++ data 1; } parent_class int inc 2 () { return ++ data 2 ; } { int data 3 ; void display () {cout << endl ; } parent_class data 4<<; "data 1=" << data 1 << " , data 2=" << data 2派生类数据成员自增 }; public: class derived_class : private parent_class (int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ) { derived_class int data 3 ; : parent_class data 4 ; ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) public: { data 3 = p 5 ; } derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } { data 3 = p 5 ; } int inc 3( )( {)return { return ++ data 3 ; }(); } int inc 1 parent_class : : inc 1 void display ( ) ++ data 3 ; } int inc 3 ( ) { return void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; { parent_class : : display<< ( ) ; data 3 data 4. display cout << "data 3=" << endl( ); ; cout << "data 3=" << data 3 << endl ; } } }}; ; parent_class data 1 data 2 int main ( ) data 4 { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } classintderived_class : private inc 1 () { return ++ data 1; } parent_class int inc 2 () {; return ++ data 2 ; } { int data 3 void display () {cout parent_class data 4<<; "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } 调用基类成员函数 }; public: class derived_class : private parent_class (int p 1 , int p 2 , int p 3 , int输出从基类继承的数据成员 p 4 , int p 5 ) { derived_class int data 3 ; : parent_class data 4 ; ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) public: { data 3 = p 5 ; } derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } { data 3 = p 5 ; } int inc 3( )( {)return { return ++ data 3 ; } (); } int inc 1 parent_class : : inc 1 void display ( ) ++ data 3 ; } int inc 3 ( ) { return void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; { parent_class : : display<< ( ) ; data 3 data 4. display cout << "data 3=" << endl( ); ; cout << "data 3=" << data 3 << endl ; } } }}; ; parent_class data 1 data 2 int main ( ) data 4 { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } classintderived_class : private inc 1 () { return ++ data 1; } parent_class int inc 2 () {; return ++ data 2 ; } { int data 3 void display () {cout parent_class data 4<<; "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } }; 调用对象成员的成员函数 public: class derived_class : private parent_class (int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ) 输出对象成员数据 { derived_class int data 3 ; : parent_class data 4 ; ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) public: { data 3 = p 5 ; } derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } { data 3 = p 5 ; } int inc 3( )( {)return { return ++ data 3 ; } (); } int inc 1 parent_class : : inc 1 void display ( ) ++ data 3 ; } int inc 3 ( ) { return void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; { parent_class : : display<< ( ) ; data 3 data 4. display cout << "data 3=" << endl( ); ; cout << "data 3=" << data 3 << endl ; } } }}; ; parent_class data 1 data 2 int main ( ) data 4 { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } classintderived_class : private inc 1 () { return ++ data 1; } parent_class int inc 2 () {; return ++ data 2 ; } { int data 3 void display () {cout parent_class data 4<<; "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } }; public: class derived_class : private parent_class (int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ) { derived_class int data 3 ; : parent_class data 4 ; ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) 输出自身数据成员 public: { data 3 = p 5 ; } derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } { data 3 = p 5 ; } int inc 3( )( {)return { return ++ data 3 ; } (); } int inc 1 parent_class : : inc 1 void display ( ) ++ data 3 ; } int inc 3 ( ) { return void display ( ) { parent_class : : display ( ) ; data 4. display ( ) ; { parent_class : : display ( )<< ; data 4. display (); ; cout << "data 3=" data 3 << endl cout << "data 3=" << data 3 << endl ; } } }}; ; parent_class data 1 data 2 int main ( ) data 4 { derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; 8. 3 基类的初始化 public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } int inc 1 () { return ++ data 1; } int inc 2 () { return ++ data 2 ; } void display () {cout << "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } }; class derived_class : private parent_class { int data 3 ; parent_class data 4 ; public: derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) { data 3 = p 5 ; } int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } int inc 3 ( ) { return ++ data 3 ; } display ( ) intvoid main () { parent_class : : display ( ) ; data 4. display ( ) ; { derived_class d 1 << ( 17 , 18 1 , 2; , -5 ) ; cout << "data 3=" data 3 <<, endl d 1}. inc 1 ( ) ; parent_class data 1 data 2 }; d 1. display ( ) ; int main ( ) data 4 { }derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } int inc 1 () { return ++ data 1; } int inc 2 () { return ++ data 2 ; } void display () {cout << "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } }; 构造派生类对象 class derived_class : private parent_class { int data 3 ; parent_class data 4 ; public: derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) { data 3 = p 5 ; } int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } int inc 3 ( ) { return ++ data 3 ; } display ( ) intvoid main () { parent_class : : display ( ) ; data 4. display ( ) ; { derived_class d 1<<( data 3 17 , 18 , 1 , ; 2 , -5 ) ; cout << "data 3=" << endl d 1}. inc 1 ( ) ; parent_class data 1 data 2 }; d 1. display ( ) ; int main ( ) data 4 { }derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

8. 3 基类的初始化 #include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class {

8. 3 基类的初始化 #include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } int inc 1 () { return ++ data 1; } int inc 2 () { return ++ data 2 ; } void display () {cout << "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } }; class derived_class : private parent_class { int data 3 ; parent_class data 4 ; data 1 自增 public: derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) { data 3 = p 5 ; } int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } int inc 3 ( ) { return ++ data 3 ; } display ( ) intvoid main () { parent_class : : display ( ) ; data 4. display ( ) ; { derived_class d 1 << ( 17 , 18 1 , 2; , -5 ) ; cout << "data 3=" data 3 <<, endl d 1}. inc 1 ( ) ; parent_class data 1 data 2 }; d 1. display ( ) ; int main ( ) data 4 { }derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } int inc 1 () { return ++ data 1; } int inc 2 () { return ++ data 2 ; } void display () {cout << "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } }; class derived_class : private parent_class { int data 3 ; parent_class data 4 ; 输出数据 public: derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) { data 3 = p 5 ; } int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } int inc 3 ( ) { return ++ data 3 ; } display ( ) intvoid main () { parent_class : : display ( ) ; data 4. display ( ) ; { derived_class d 1 << ( 17 , 18 1 , 2; , -5 ) ; cout << "data 3=" data 3 <<, endl d 1}. inc 1 ( ) ; parent_class data 1 data 2 }; d 1. display ( ) ; int main ( ) data 4 { }derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 8. 3 基类的初始化 derived_class 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 data 2

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1

#include<iostream> using namespace std ; 例8 -7 带参数构造函数调用顺序测试 class parent_class { int data 1 , data 2 ; public : parent_class ( int p 1 , int p 2 ) { data 1 = p 1; data 2 = p 2; } int inc 1 () { return ++ data 1; } int inc 2 () { return ++ data 2 ; } void display () {cout << "data 1=" << data 1 << " , data 2=" << data 2 << endl ; } }; 自增了1 class derived_class : private parent_class { int data 3 ; parent_class data 4 ; public: derived_class ( int p 1 , int p 2 , int p 3 , int p 4 , int p 5 ): parent_class ( p 1 , p 2 ) , data 4 ( p 3 , p 4 ) { data 3 = p 5 ; } int inc 1 ( ) { return parent_class : : inc 1 ( ) ; } int inc 3 ( ) { return ++ data 3 ; } display ( ) intvoid main () { parent_class : : display ( ) ; data 4. display ( ) ; { derived_class d 1 << ( 17 , 18 1 , 2; , -5 ) ; cout << "data 3=" data 3 <<, endl d 1}. inc 1 ( ) ; parent_class data 1 data 2 }; d 1. display ( ) ; int main ( ) data 4 {}derived_class d 1 ( 17 , 18 , 1 , 2 , -5 ) ; d 1. inc 1 ( ) ; d 1. display ( ) ; } 基类的初始化 华南理 大学计算机学院 周霭如 2009 data 1 data 2 data 3 data 1 8. 3 derived_class data 2

class Point { friend ostream &operator<< (ostream &, const Point &); public: Point( int

class Point { friend ostream &operator<< (ostream &, const Point &); public: Point( int = 0, int = 0 ) ; // 带默认参数的构造函数 void set. Point( int, int ) ; // 对点坐标数据赋值 int get. X() const { return x ; } int get. Y() const { return y ; } protected: int x, y; // Point类的数据成员 }; class Circle : public Point { friend ostream &operator<< (ostream &, const Circle &); // 友元函数 public: Circle(double r=0. 0, int x=0, int y=0); // 构造函数 void set. Radius(double); /*置半径*/ double get. Radius() const; /*返回半径*/ double area() const; // 返回面� protected: double radius; // 数据成� ,半径 }; class Cylinder: public Circle { friend ostream & operator<<(ostream &, const Cylinder &); // 友元函数 public: Cylinder(double h=0. 0, double r=0. 0, int x=0, int y=0); // 构造函数 void set. Height(double); /* 置高度� */ double get. Height() const; /* 返回高度� */ double area() const; /* 返回面� */ double volume() const; /* 返回体� */ protected: double height; // 数据成� ,高度 }; 8. 4 华南理 大学计算机学院 周霭如 2009 继承的应用实例

继承的应用实例 { friend ostream &operator<< (ostream &, const Point &); public: Point( int =

继承的应用实例 { friend ostream &operator<< (ostream &, const Point &); public: Point( int = 0, int = 0 ) ; // 带默认参数的构造函数 void set. Point( int, int ) ; // 对点坐标数据赋值 int get. X() const { return x ; } int get. Y() const { return y ; } protected: int x, y; // Point类的数据成员 }; class Circle : public Point class Circle : public { friend ostream &operator<< (ostream &, const Circle &); // 友元函数 public: Circle(double r=0. 0, int x=0, int y=0); // 构造函数 void set. Radius(double); /*置半径*/ double get. Radius() const; /*返回半径*/ double area() const; // 返回面� protected: double radius; // 数据成� ,半径 }; class Cylinder: public Circle class Cylinder: public { friend ostream & operator<<(ostream &, const Cylinder &); // 友元函数 public: Cylinder(double h=0. 0, double r=0. 0, int x=0, int y=0); // 构造函数 void set. Height(double); /* 置高度� */ double get. Height() const; /* 返回高度� */ double area() const; /* 返回面� */ double volume() const; /* 返回体� */ protected: double height; // 数据成� ,高度 }; 华南理 大学计算机学院 周霭如 2009 8. 4 class Point

继承的应用实例 void set. Radius(double); /*置半径*/ double get. Radius() const; /*返回半径*/ double area() const; //

继承的应用实例 void set. Radius(double); /*置半径*/ double get. Radius() const; /*返回半径*/ double area() const; // 返回面� protected: double radius; // 数据成� ,半径 }; class Cylinder: public Circle { friend ostream & operator<<(ostream &, const Cylinder &); // 友元函数 public: Cylinder(double h=0. 0, double r=0. 0, int x=0, int y=0); // 构造函数 void set. Height(double); /* 置高度� */ double get. Height() const; /* 返回高度� */ double area() const; /* 返回面� */ double volume() const; /* 返回体� */ protected: double height; // 数据成� ,高度 }; 华南理 大学计算机学院 周霭如 2009 8. 4 class Point { friend ostream &operator<< (ostream &, const Point &); { public: friend ostream &operator<< (ostream &, const Point &); Point( int = 0, int = 0 ) ; // 带默认参数的构造函数 public: void set. Point( 对点坐标数据赋值 Point( int =int, 0, intint) ; = 0 ) ; ////带默认参数的构造函数 int get. X() const { return x ; } int get. Y() const { return y ; } void set. Point( int, int ) ; // 对点坐标数据赋值 protected: int x, y; // Point类的数据成员 }; int get. X() const { return x ; } class : public Point int. Circle get. Y() const { return y ; } { friend ostream &operator<< (ostream &, const Circle &); // 友元函数 protected: int x, y; // Point类的数据成员 public: }; Circle(double r=0. 0, int x=0, int y=0); // 构造函数

class Point { friend ostream &operator<< (ostream &, const Point &); public: Point( int

class Point { friend ostream &operator<< (ostream &, const Point &); public: Point( int = 0, int = 0 ) ; // 带默认参数的构造函数 void set. Point( int, int ) ; // 对点坐标数据赋值 int get. X() const { return x ; } int get. Y() const { return y ; } protected: int x, y; // Point类的数据成员 }; class Circle : public Point { { friend ostream &operator<< (ostream &, &); const Circle &); // 友元函数 friend ostream &operator<< (ostream &, const Circle // 友元函数 public: Circle(double r=0. 0, int x=0, int y=0); // 构造函数 void set. Radius(double); /*置半径*/ double get. Radius() const; /*返回半径*/ void doubleset. Radius(double); area() const; // 返回面�//置半径 protected: double radius; const; // 数据成�//,半径 double get. Radius() 返回半径 }; double area() const; // 返回面� class Cylinder: public Circle protected: { friend ostream & operator<<(ostream &, const Cylinder &); // 友元函数 double radius; // 数据成� ,半径 public: }; Cylinder(double h=0. 0, double r=0. 0, int x=0, int y=0); // 构造函数 void set. Height(double); /* 置高度� */ double get. Height() const; /* 返回高度� */ double area() const; /* 返回面� */ double volume() const; /* 返回体� */ protected: double height; // 数据成� ,高度 }; 8. 4 华南理 大学计算机学院 周霭如 2009 继承的应用实例

class Point { friend ostream &operator<< (ostream &, const Point &); public: Point( int

class Point { friend ostream &operator<< (ostream &, const Point &); public: Point( int = 0, int = 0 ) ; // 带默认参数的构造函数 void set. Point( int, int ) ; // 对点坐标数据赋值 int get. X() const { return x ; } int get. Y() const { return y ; } protected: int x, y; // Point类的数据成员 }; class Circle : public Point { friend ostream &operator<< (ostream &, const Circle &); // 友元函数 class Cylinder: public Circle public: { Circle(double friend ostream & x=0, operator<<(ostream &, const Cylinder &); // 友元函数 r=0. 0, int y=0); // 构造函数 void set. Radius(double); /*置半径*/ double get. Radius() const; /*返回半径*/ public: double area() const; // 返回面� Cylinder(double h=0. 0, double r=0. 0, int x=0, int y=0); // 构造函数 protected: double radius; // 数据成� ,半径 // 置高度� }; void set. Height(double); class Cylinder: public Circle const; double get. Height() // 返回高度� { double friend ostream & operator<<(ostream const Cylinder &); // 友元函数 area() const; // &, 返回面� public: double volume() const; // 返回体� Cylinder(double h=0. 0, double r=0. 0, int x=0, int y=0); // 构造函数 protected: void set. Height(double); /* 置高度� */ double get. Height() const; /* 返回高度� */ double area() const; /* 返回面� double volume() const; /* 返回体� */ double height; // */ 数据成� ,高度 protected: double height; // 数据成� ,高度 }; }; 8. 4 华南理 大学计算机学院 周霭如 2009 继承的应用实例

// Circle 类的成员函数 8. 4 继承的应用实例 // 带初始化式构造函数,首先调用基类构造函数 Circle: : Circle( double r, int

// Circle 类的成员函数 8. 4 继承的应用实例 // 带初始化式构造函数,首先调用基类构造函数 Circle: : Circle( double r, int a, int b ): Point( a, b ) { set. Radius ( r ); } // 对半径置值 void Circle: : set. Radius ( double r ) { radius = ( r >= 0 ? r : 0 ); } // 返回半径值 double Circle: : get. Radius() const { return radius; } // 计算并返回面积值 double Circle: : area() const { return 3. 14159 * radius ; } // 输出圆心坐标和半径值 ostream & operator<< ( ostream &output, const Circle &c) { output << "Center = " << '[' << c. x << ", " << c. y << "]" << "; Radius = " << setiosflags(ios: : fixed|ios: : showpoint) << setprecision(2) << c. radius ; return output ; } 华南理 大学计算机学院 周霭如 2009

// Cylinder 类的成员函数 // 带初始化式构造函数,首先调用基类构造函数 8. 4 继承的应用实例 Cylinder: : Cylinder(double h, double r,

// Cylinder 类的成员函数 // 带初始化式构造函数,首先调用基类构造函数 8. 4 继承的应用实例 Cylinder: : Cylinder(double h, double r, int x, int y): Circle(r, x, y) { set. Height(h); } // 对高度置值 void Cylinder: : set. Height(double h) { height = ( h >= 0 ? h : 0 ); } // 返回高度值 double Cylinder: : get. Height() const { return height; } // 计算并返回圆柱体的表面积 double Cylinder: : area() const { return 2*Circle: : area()+2*3. 14159*radius*height; } // 计算并返回圆柱体的体积 double Cylinder: : volume() const { return Circle: : area()*height; } // 输出数据成员圆心坐标、半径和高度值 ostream &operator<< ( ostream &output, const Cylinder &cy ) { output << "Center = " << '[' << cy. x << ", " << cy. y << "]" << "; Radius = " << setiosflags(ios: : fixed|ios: : showpoint) << setprecision(2) << cy. radius << "; Height = " << cy. height << endl ; return output; } 华南理 大学计算机学院 周霭如 2009

#include<iostream> using namespace std ; #include <iomanip. h> int main() { Point p (

#include<iostream> using namespace std ; #include <iomanip. h> int main() { Point p ( 72, 115 ) ; //定义点对象并初始化 cout << "The initial location of p is " << p << endl ; p. set. Point ( 10, 10 ) ; //置点的新数据值 cout << "n. The new location of p is " << p << endl ; //输出数据 Circle c ( 2. 5, 37, 43 ) ; //定义圆对象并初始化 cout<<"n. The initial location and radius of c aren"<<c<<"n. Area = "<<c. area()<<"n" ; //置圆的新数据值 c. set. Radius ( 4. 25 ) ; c. set. Point ( 2, 2 ) ; //输出圆心坐标和圆面积 cout<<"n. The new location and radius of c aren"<<c<<"n. Area = "<<c. area()<< "n" ; Cylinder cyl ( 5. 7, 2. 5, 12, 23 ) ; //定义圆柱体对象并初始化 //输出圆柱体各数据和表面积,体积 cout << "n. The initial location, radius ang height of cyl aren" << cyl << "Area = " << cyl. area() << "n. Volume = " << cyl. volume() << 'n'; //置圆柱体的新数据值 cyl. set. Height ( 10 ) ; cyl. set. Radius ( 4. 25 ) ; cyl. set. Point ( 2, 2 ) ; cout << "n. The new location, radius ang height of cyl aren" << cyl << "Area = " << cyl. area() << "n. Volume = "<<cyl. volume()<< "n" ; } 8. 4 华南理 大学计算机学院 周霭如 2009 继承的应用实例

8. 4 继承的应用实例 //用继承方式设计Point类和Circle类 例8 -9 类继承和类包含的比较 #include<iostream> using namespace std ; class Point

8. 4 继承的应用实例 //用继承方式设计Point类和Circle类 例8 -9 类继承和类包含的比较 #include<iostream> using namespace std ; class Point { public : Point(double t 1, double t 2) { x=t 1; y=t 2; } void Out. Point() { cout << "Point: x=" << x << " y=" << y << endl ; } protected : double x, y; }; class Circle : public Point //Circle类继承Point类 { public: Circle(double t 1, double t 2, double t 3) : Point(t 1, t 2) { radius = t 3 ; } void Out. Circle() { Point: : Out. Point(); cout << "radius=" << radius << endl ; } protected: double radius; //派生类数据成员 }; int main() { Circle c( 0, 0, 12. 5 ) ; c. Out. Point() ; //调用从基类Point继承的成员函数 c. Out. Circle() ; //调用Circle类成员函数 } 华南理 大学计算机学院 周霭如 2009

8. 4 继承的应用实例 //用继承方式设计Point类和Circle类 例8 -9 类继承和类包含的比较 #include<iostream> using namespace std ; class Point

8. 4 继承的应用实例 //用继承方式设计Point类和Circle类 例8 -9 类继承和类包含的比较 #include<iostream> using namespace std ; class Point { public : Circle类继承Point(double t 1, double t 2) { x=t 1; y=t 2; } void Out. Point() { cout << "Point: x=" <<类 x << " y=" << y << endl ; } 调用基类构造函数 protected : double x, y; }; class. Circle : : public //Circle类继承Point类 class public. Point 调用基类成员函数 { public: Point(t 1, t 2) { radius = t 3 ; } Circle(double t 1, double t 2, double t 3) : : Point(t 1, t 2) void Out. Circle() { Point: : Out. Point(); cout << "radius=" << radius << endl ; } protected: double radius; //派生类数据成员 对象c的数据成员 }; int main() c. x c. y c. radius { Circle 12. 5 ); ); Circlec(c(0, 0, 12. 5 c. Out. Point() Point 继承的成员函数 c. Out. Point(); ; //调用从基类 Point 继承的成员函数 c. Out. Circle() Circle 类成员函数 c. Out. Circle(); ; //调用 Circle 类成员函数 } 华南理 大学计算机学院 周霭如 2009

8. 4 继承的应用实例 //用包含方式设计Point类和Circle类 例8 -9 类继承和类包含的比较 #include<iostream> using namespace std ; class Point

8. 4 继承的应用实例 //用包含方式设计Point类和Circle类 例8 -9 类继承和类包含的比较 #include<iostream> using namespace std ; class Point { public : Point(double t 1, double t 2) { x=t 1; y=t 2; } void Out. Point() { cout << "Point: x=" << x << " y=" << y << endl ; } protected : double x, y; }; class Circle { public: Circle(double t 1, double t 2, double t 3) : centre(t 1, t 2) { radius = t 3 ; } void Out. Circle() { centre. Out. Point(); cout << "radius=" << radius << endl ; } Point centre; //包含Point成员 protected: double radius; }; int main() { Circle c( 0, 0, 12. 5 ) ; c. centre. Out. Point() ; //通过成员centre调用Point的成员函数 c. Out. Circle() ; //调用Circle类成员函数 } 华南理 大学计算机学院 周霭如 2009

8. 4 继承的应用实例 //用包含方式设计Point类和Circle类 例8 -9 类继承和类包含的比较 #include<iostream> using namespace std ; class Point

8. 4 继承的应用实例 //用包含方式设计Point类和Circle类 例8 -9 类继承和类包含的比较 #include<iostream> using namespace std ; class Point { public : Point(double t 1, double t 2) { x=t 1; y=t 2; } void Out. Point() { cout << "Point: x=" << x << " y=" << y << endl ; } protected : double x, y; 调用成员类构造函数 }; class. Circle class 调用成员类成员函数 { public: 包含Point类成员 Circle(double t 1, double t 2, double t 3) : centre(t 1, t 2) { radius = t 3 ; } void Out. Circle() { centre. Out. Point(); cout << "radius=" << radius << endl ; } Point //包含Point成员 Pointcentre; 对象c的数据成员 protected: double radius; }; c. centre int main() c. centre. x c. centre. y c. radius { Circle 12. 5 ); ); Circlec(c(0, 0, 12. 5 c. centre. Out. Point() ; ; //通过成员 centre 调用Point 的成员函数 c. centre. Out. Point() //通过成员 centre. Point 的成员函数 c. Out. Circle() ; //调用Circle类成员函数 } 华南理 大学计算机学院 周霭如 2009

多继承的简单应用 8. 5. 1 多继承的派生类构造和访问 class Base 1 { public: Base 1(int x) {

多继承的简单应用 8. 5. 1 多继承的派生类构造和访问 class Base 1 { public: Base 1(int x) { value = x ; } int get. Data() const { return value ; } protected: int value; }; class Base 2 { public: Base 2(char c) { letter=c; } char get. Data() const { return letter; } protected: char letter; }; class Derived : public Base 1, public Base 2 { friend ostream &operator<< ( ostream &, const Derived & ) ; public : Derived ( int, char, double ) ; double get. Real() const ; private : double real ; }; 华南理 大学计算机学院 周霭如 2009

多继承的简单应用 8. 5. 1 多继承的派生类构造和访问 class Base 1 int main() { public: { Base

多继承的简单应用 8. 5. 1 多继承的派生类构造和访问 class Base 1 int main() { public: { Base 1 b 1 ( 10 ) ; Base 1(int x) { value = x ; } Base 2 b 2 ( 'k' ) ; int get. Data() const { return value ; } protected: Derived d ( 5, 'A', 2. 5 ) ; int value; : }; return ; class Base 2 { public: } Base 2(char c) { letter=c; } char get. Data() const { return letter; } protected: char letter; value }; class Derived : public Base 1, public Base 2 10 Basc 1 b 1 { friend ostream &operator<< ( ostream &, const Derived & ) ; letter public : 'K' Basc 2 b 2 Derived ( int, char, double ) ; double get. Real() const ; private : Derived d 5 'A' double real ; }; 华南理 大学计算机学院 周霭如 2009 real 2. 5

例如: 8. 5. 2 虚基类 class B { public : int b ; }

例如: 8. 5. 2 虚基类 class B { public : int b ; } ; class B { b } class B 1 { b 1 } class B 2 {b 2} class B 1 : public B { private : int b 1 ; } ; class B 2 : public B { private : int b 2 ; } ; class C : public B 1 , public B 2 { public : int f ( ) ; private : int d ; } ; class C { f () , d } 有: C c; c. B; // error c. B : : b ; // error,从哪里继承的? c. B 1 : : b ; // ok,从B 1继承的 c. B 2 : : b ; // ok ,从B 2继承的 华南理 大学计算机学院 周霭如 2009

例如: 8. 5. 2 虚基类 class B { public : int b ; }

例如: 8. 5. 2 虚基类 class B { public : int b ; } ; class B { b } class B 1 { b 1 } class B 2 {b 2} class B 1 : public B { private : int b 1 ; } ; class B 2 : public B { private : int b 2 ; } ; class C : public B 1 , public B 2 { public : int f ( ) ; private : int d ; } ; class C { f () , d } #include<iostream> using namespace std ; int main () {C c; c. B 1 : : b = 5 ; c. B 2 : : b = 10 ; cout << "path B 1==> " << c. B 1 : : b << endl ; cout << "path B 2==> " << c. B 2 : : b << endl ; } 华南理 大学计算机学院 周霭如 2009

例如: class B { public : int b ; } ; 8. 5. 2

例如: class B { public : int b ; } ; 8. 5. 2 虚基类 class B { b } class B 1 : virtual public B { private : int b 1 ; } ; class B 2 : virtual public B { private : int b 2 ; } ; class C : public B 1 , public B 2 class B 1 { b 1} { private : float d ; } ; class B 2 {b 2} 带有虚基类的派生类 C 的对象的存储结构示意 class C { d } c. b 1 c. b 2 B 1 B 2 c. d c. b 华南理 大学计算机学院 周霭如 2009 B C

#include<iostream> using namespace std ; class A { public : A ( ) {

#include<iostream> using namespace std ; class A { public : A ( ) { cout << "class A" << endl ; } }; class B : public A { public : B ( ) {cout << "class B" << endl ; } }; class C : public A { public : C ( ) {cout << "class C" << endl ; } }; class D : public B , public C { public : D ( ) {cout << "class D" << endl ; } 两次调用 }; A的构造函数 int main ( ) { D dd ; } 华南理 大学计算机学院 周霭如 2009 例8 -9 虚继承的测试 8. 5. 2 虚基类 class A class B class C class D

#include<iostream> using namespace std ; class A { public : A ( ) {

#include<iostream> using namespace std ; class A { public : A ( ) { cout << "class A" << endl ; } }; virtual. Apublic A class B : : public { public : B ( ) {cout << "class B" << endl ; } }; virtual. Apublic A class C : : public { public : C ( ) {cout << "class C" << endl ; } }; class D : public B , public C { public : D ( ) {cout << "class D" << endl ; } 一次调用 }; int main ( ) A的构造函数 { D dd ; } 华南理 大学计算机学院 周霭如 2009 例8 -9 虚继承的测试 8. 5. 2 虚基类 class A class B B class A class. CC class. DD class