多繼承ios
class Worker:public Person,public job 函數
多繼承的二異性:兩個父類有相同名字的方法。 this
1 // 2 // Person.h 3 // ArrayTest 4 // 5 // Created by 張學院 on 14-1-8. 6 // Copyright (c) 2014年 com.mix. All rights reserved. 7 // 8 9 //防止重複引用 10 #ifndef __ArrayTest__Person__ 11 #define __ArrayTest__Person__ 12 13 #include <iostream> 14 using namespace std; 15 class Person{ 16 //---------成員變量-------- 17 public : 18 19 int age; 20 21 private : 22 int weight; 23 char * name; 24 char sex; 25 //---------成員方法-------- 26 public: 27 //----構造函數------- 28 Person(); 29 //-----構造函數重載----- 30 Person(int age); 31 32 //------拷貝構造函數------- 33 Person(const Person & per); 34 35 //----------操做符重載---------- 36 Person & operator=(const Person &right); 37 38 void setWeight(int weight); 39 int getWeight() const; 40 //char * getName() const; 41 //const 指針,保證指針不被修改 42 const char * getName() const; 43 void setName(const char * name); 44 //-----虛函數:子類的可能會重寫父類的的方法,當父類的指針指向子類的對象,子類對象調用的是子類本身的方法-------- 45 virtual void info() const; 46 //-----純虛函數-------- 47 //virtual void info() const=0; 48 ~Person(); 49 static void print(); 50 //---類方法重載---- 51 static Person * Create(); 52 static Person * Create(const char * name); 53 }; 54 55 class Action{ 56 private: 57 int x; 58 int y; 59 public: 60 void move(int x,int y); 61 virtual void info() const; 62 63 }; 64 65 class Student:public Person,public Action{ 66 private: 67 float score; 68 public: 69 void info() const; 70 Student(); 71 ~Student(); 72 73 }; 74 75 76 77 class Worker:public Person{ 78 public : 79 void info() const; 80 }; 81 #endif /* defined(__ArrayTest__Person__) */
1 // 2 // Person.h 3 // ArrayTest 4 // 5 // Created by 張學院 on 14-1-8. 6 // Copyright (c) 2014年 com.mix. All rights reserved. 7 // 8 9 //防止重複引用 10 #ifndef __ArrayTest__Person__ 11 #define __ArrayTest__Person__ 12 13 #include <iostream> 14 using namespace std; 15 class Person{ 16 //---------成員變量-------- 17 public : 18 19 int age; 20 21 private : 22 int weight; 23 char * name; 24 char sex; 25 //---------成員方法-------- 26 public: 27 //----構造函數------- 28 Person(); 29 //-----構造函數重載----- 30 Person(int age); 31 32 //------拷貝構造函數------- 33 Person(const Person & per); 34 35 //----------操做符重載---------- 36 Person & operator=(const Person &right); 37 38 void setWeight(int weight); 39 int getWeight() const; 40 //char * getName() const; 41 //const 指針,保證指針不被修改 42 const char * getName() const; 43 void setName(const char * name); 44 //-----虛函數:子類的可能會重寫父類的的方法,當父類的指針指向子類的對象,子類對象調用的是子類本身的方法-------- 45 virtual void info() const; 46 //-----純虛函數-------- 47 //virtual void info() const=0; 48 ~Person(); 49 static void print(); 50 //---類方法重載---- 51 static Person * Create(); 52 static Person * Create(const char * name); 53 }; 54 55 class Action{ 56 private: 57 int x; 58 int y; 59 public: 60 void move(int x,int y); 61 virtual void info() const; 62 63 }; 64 65 class Student:public Person,public Action{ 66 private: 67 float score; 68 public: 69 void info() const; 70 Student(); 71 ~Student(); 72 73 }; 74 75 76 77 class Worker:public Person{ 78 public : 79 void info() const; 80 }; 81 #endif /* defined(__ArrayTest__Person__) */
2 // Person.cpp 3 // ArrayTest 4 // 5 // Created by 張學院 on 14-1-8. 6 // Copyright (c) 2014年 com.mix. All rights reserved. 7 // 8 9 #include "Person.h" 10 //------方法實現格式------ 11 //----返回值 類::方法名 (參數)------ 12 void Person::setWeight(int weight){ 13 //-----this 表明 14 this->weight=weight; 15 } 16 //--------const 編譯限制------- 17 int Person::getWeight() const{ 18 //weight++;報錯 19 return weight; 20 } 21 const char * Person::getName() const{ 22 23 return name; 24 25 } 26 void Person::setName(const char * name){ 27 28 strcpy(this->name, name); 29 30 } 31 void Person::info() const{ 32 33 //printf("%s\n%d\n%c\n%d\n",name,age,sex,weight); 34 printf(" this is a person\n"); 35 36 } 37 //--------構造函數:初始化成員變量------------ 38 Person::Person(){ 39 printf("call the functon Person()\n"); 40 //name 改爲指針的時候 name 沒有有效地址 。strcpy 報錯 41 //strcpy(name, "a man"); 42 //在堆裏分配內存,返回首地址,在堆裏面分配的空間必定要記得釋放內存!!!!! 43 name = new char[255]; 44 strcpy(name, "a man"); 45 weight=60; 46 age=20; 47 sex='m'; 48 } 49 //--------構造函數:重載------------ 50 Person::Person(int age){ 51 printf("call the functon Person(int age)\n"); 52 //name 改爲指針的時候 name 沒有有效地址 。strcpy 報錯 53 //strcpy(name, "a man"); 54 name = new char[255]; 55 strcpy(name, "a man"); 56 weight=60; 57 this->age=age; 58 sex='m'; 59 60 } 61 62 //------拷貝構造函數------- 63 Person::Person(const Person & person){ 64 /* 本身不實現的拷貝構造函數的話,系統生成的拷貝構造函數 65 this->name=person.name; 66 this->age=person.age; 67 this->weight=person.weight; 68 this->sex=person.sex; 69 */ 70 // 本身實現的拷貝構造函數的話 71 //從新分配內存 72 this->name= new char[255]; 73 strcpy(this->name, person.name); 74 this->age=person.age; 75 this->weight=person.weight; 76 this->sex=person.sex; 77 78 } 79 80 //-----------析構函數--------- 81 Person::~Person(){ 82 //在析構函數裏面釋放內存 83 printf("call the functon ~Person()析構函數 \n"); 84 delete [] name; 85 86 } 87 88 //----------操做符重載---------- 89 Person & Person::operator=(const Person &right){ 90 /* 本身不實現的操做符重載的話,系統生成的拷貝構造函數 91 92 this->name=right.name; 93 this->age=right.age; 94 this->sex=right.sex; 95 this->weight=right.weight; 96 */ 97 //---------不須要再次分配內存------- 98 // this->name= new char[255]; 99 strcpy(this->name, right.name); 100 this->age=right.age; 101 this->sex=right.sex; 102 this->weight=right.weight; 103 return *this; 104 } 105 //-------不用在加static-------- 106 void Person::print(){ 107 printf("Person::print()\n"); 108 109 } 110 111 Person * Person::Create(){ 112 113 Person * per= new Person(); 114 return per; 115 } 116 Person * Person::Create(const char * name){ 117 Person * per=Person::Create(); 118 per->setName(name); 119 return per; 120 } 121 //--------------student---------- 122 //-------------調用父類的同名的函數,---------------- 123 void Student::info() const{ 124 // printf("%s\n%d\n%c\n%d %.2f\n",name,age,sex,weight,score); 125 // Person::info(); 126 //printf("%.2f\n",score); 127 Person::info(); 128 Action::info(); 129 printf(" this is a student\n"); 130 131 } 132 //---------子類的構造函數:不須要再調用父類的構造函數------ 133 Student::Student(){ 134 score=1.00f; 135 136 } 137 Student::~Student(){ 138 printf(" call the functon ~Student()析構函數 \n"); 139 140 } 141 142 void Worker::info() const{ 143 printf(" this is a worker\n"); 144 145 } 146 147 void Action::move(int x,int y){ 148 this->x=x; 149 this->y=y; 150 151 } 152 void Action::info() const{ 153 printf(" move to %d,%d\n",x,y); 154 }
1 // 2 // main.cpp 3 // ArrayTest 4 // 5 // Created by 張學院 on 14-1-6. 6 // Copyright (c) 2014年 com.mix. All rights reserved. 7 // 8 9 #include <iostream> 10 11 #include <string> 12 #include "Person.h" 13 14 int main() 15 { 16 17 Student stu; 18 stu.move(3,5); 19 20 21 Person per; 22 per.info(); 23 24 Action a; 25 a.info(); 26 27 //----若是student沒有info方法的,而Person和Action都有info的話,就會報錯-------- 28 stu.info(); 29 }
輸出:spa
call the functon Person()指針
call the functon Person()code
this is a person對象
move to 0,1blog
this is a person繼承
move to 3,5內存
this is a student
call the functon ~Person()析構函數
call the functon ~Student()析構函數
call the functon ~Person()析構函數