c++知識學習 (8)

多繼承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()析構函數

相關文章
相關標籤/搜索