多继承的例子

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 class Person {
 6 protected:
 7     char m_name[18];//姓名 
 8     int m_age; 
 9     char m_sex[3];
10 public:
11     Person(char name[], int age,char sex[]);//声明构造函数
12     //    Person(){} 
13     Person(Person &m_cp);//声明拷贝构造函数  
14     void show();//声明输出函数 
15 };
16 
17 Person::Person(char name[], int age,char sex[]) {//构造函数对成员进行初始化 
18     strcpy(m_name, name);
19     m_age = age;
20     strcpy(m_sex, sex);
21 }
22 
23 Person::Person(Person &m_cp){//拷贝构造函数,对成员进行浅拷贝 
24     strcpy(m_name, m_cp.m_name);
25     m_age = m_cp.m_age;
26     strcpy(m_sex, m_cp.m_sex);
27 } 
28 
29 void Person::show() {//定义输出函数 
30      cout << m_name << " " << m_age << " " << m_sex << endl;
31 }
32 
33 class Cadre :public Person {//定义一个派生类 
34 private:
35     char m_position[8];
36 public:
37     Cadre(char name[], int age,char sex[], char position[]);//声明构造函数
38      Cadre(Cadre &cp);//声明拷贝构造函数 
39     void show();//声明输出函数
40 };
41 
42 Cadre::Cadre(char name[], int age,char sex[], char position[]):Person(name, age, sex) {
43 /*这里派生类定义了新的成员,首先理解一下这句话,如果派生类构造函数没有显式的调用
44 
45 基类中的构造函数,那么派生类中的构造函数就会调用基类中的默认构造函数,所以,如果你把
46 
47 char name[]--char sex[]...person(name,age,sex)删去,程序就会报错,因为在基类中我定义
48 
49 了构造函数,默认构造函数不会自动生成,上面注释掉的就是基类默认构造函数.char name[]--char sex[]...person(name,age,sex)这个就是调用基类中的构造函数*/
50     strcpy(m_position, position);
51 }
52 
53 Cadre::Cadre(Cadre &cp):Person(cp){//定义拷贝构造函数 
54 /*定义拷贝构造函数时,因为也涉及到调用基类的拷贝构造函数,所以Person(cp)就是调用基类中的拷贝构造函数进行浅拷贝(基类中我定义了拷贝构造函数,你不写也行,
55 它会调用默认拷贝函数,同时这里浅拷贝就行,深拷贝之前说的那种指着型需要)*/
56     strcpy(m_position, cp.m_position);//对派生类成员拷贝 
57 }
58 
59 void Cadre::show() {//定义输出函数 
60     cout << m_name << " " << m_age << " " << m_sex << " ";
61     cout << m_position << endl;
62 }
63 
64 int main()
65 {
66     Person s1("李华", 20, "");
67     s1.show();
68     Cadre s2("李华", 20, "", "财务总监");
69     s2.show();
70     Cadre s3(s2);
71     s3.show();
72     return 0;
73 }

 

  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5 class Person {
  6 public:
  7     const char *m_name;
  8     int m_age;
  9     const char *m_sex;
 10 public:
 11     Person(const char *name, int age,const char *sex);
 12     void show();
 13 };
 14 
 15 Person::Person(const char *name, int age,const char *sex) {
 16     m_name = name;
 17     m_age = age;
 18     m_sex = sex;
 19 }
 20 
 21 void Person::show() {
 22      cout << m_name << " " << m_age << " " << m_sex << endl;
 23 }
 24 
 25 class Cadre :public Person {
 26 public:
 27     const char *m_position;
 28 public:
 29     Cadre(const char *name, int age,const char *sex, const char *position);
 30     void show();
 31 };
 32 
 33 Cadre::Cadre(const char *name, int age,const char *sex, const char *position):Person(name, age, sex) {
 34     m_position = position;
 35 }
 36 
 37 void Cadre::show() {
 38     cout << m_name << " " << m_age << " " << m_sex << " ";
 39     cout << m_position << endl;
 40 }
 41 
 42 class Teacher :public Person {
 43 private:
 44     const char *m_title;
 45 public:
 46     Teacher(const char *name, int age,const char *sex, const char *title);
 47     void show();
 48 };
 49 
 50 Teacher::Teacher(const char *name, int age,const char *sex, const char *title):Person(name, age, sex) {
 51     m_title = title;
 52 }
 53 
 54 void Teacher::show() {
 55     cout << m_name << " " << m_age << " " << m_sex << " ";
 56     cout << m_title;
 57 }
 58 
 59 int main()
 60 {
 61     Person s1("李华", 20, "");
 62     s1.show();
 63     Cadre s2("李华", 20, "", "财务总监");
 64     s2.show();
 65     Teacher s3("李华", 20, "", "软件开发");
 66     s3.show();
 67     return 0;
 68 }
 69 
 70 
 71 
 72 
 73 
 74 
 75 
 76 
 77 
 78 
 79 
 80 
 81 #include <iostream>
 82 #include <cstring>
 83 using namespace std;
 84 
 85 class Person {
 86 protected:
 87     char m_name[18];
 88     int m_age;
 89     char m_sex[3];
 90 public:
 91     Person(char name[], int age,char sex[]);
 92     Person(Person &m_cp);
 93     void show();
 94 };
 95 
 96 Person::Person(char name[], int age,char sex[]) {
 97     strcpy(m_name, name);
 98     m_age = age;
 99     strcpy(m_sex, sex);
100 }
101 
102 Person::Person(Person &m_cp){
103     strcpy(m_name, m_cp.m_name);
104     m_age = m_cp.m_age;
105     strcpy(m_sex, m_cp.m_sex);
106 } 
107 
108 void Person::show() {
109      cout << m_name << " " << m_age << " " << m_sex << endl;
110 }
111 
112 class Cadre :public Person {
113 private:
114     char m_position[8];
115 public:
116     Cadre(char name[], int age,char sex[], char position[]);//声明构造函数
117      Cadre(Cadre &cp);//声明拷贝构造函数 
118     void show();//声明输出函数
119 };
120 
121 Cadre::Cadre(char name[], int age,char sex[], char position[]):Person(name, age, sex) {//Person(name, age, sex)
122     strcpy(m_position, position);
123 }
124 
125 Cadre::Cadre(Cadre &cp):Person(cp){
126     
127     strcpy(m_position, cp.m_position);
128 }
129 
130 void Cadre::show() {
131     cout << m_name << " " << m_age << " " << m_sex << " ";
132     cout << m_position << endl;
133 }
134 
135 int main()
136 {
137     Person s1("李华", 20, "");
138     s1.show();
139     Cadre s2("李华", 20, "", "财务总监");
140     s2.show();
141     Cadre s3(s2);
142     s3.show();
143     return 0;
144 }
145 
146 
147 
148 
149 
150 
151 
152 
153 
154 #include <iostream>
155 #include <cstring>
156 using namespace std;
157 
158 class Person {
159 protected:
160     char *m_name;
161     int m_age;
162     char *m_sex;
163 public:
164     Person(char name[], int age,char sex[]);
165     Person(Person &m_cp);
166     void show();
167 };
168 
169 Person::Person(char *name, int age,char *sex) {
170     m_name = name;
171     m_age = age;
172     m_sex = sex;
173 }
174 
175 Person::Person(Person &m_cp){
176     m_name = new char[strlen(m_cp.m_name) + 1];
177     if(m_name != NULL)
178     strcpy(m_name, m_cp.m_name);
179     m_age = m_cp.m_age;
180     m_sex = new char[strlen(m_cp.m_sex) +1];
181     if(m_sex != NULL)
182     strcpy(m_sex, m_cp.m_sex);
183 } 
184 
185 void Person::show() {
186      cout << m_name << " " << m_age << " " << m_sex << endl;
187 }
188 
189 class Cadre :public Person {
190 private:
191     char *m_position;
192 public:
193     Cadre(char name[], int age,char sex[], char position[]);
194      Cadre(Cadre &cp);//声明拷贝构造函数 
195     void show();
196 };
197 
198 Cadre::Cadre(char *name, int age,char *sex, char position[]):Person(name, age, sex) {
199     m_position = position;
200 }
201 
202 Cadre::Cadre(Cadre &cp):Person(cp){
203     m_position = new char[strlen(cp.m_position) + 1];
204     if(m_position != NULL)
205     strcpy(m_position, cp.m_position);
206 }
207 
208 void Cadre::show() {
209     cout << m_name << " " << m_age << " " << m_sex << " ";
210     cout << m_position << endl;
211 }
212 
213 int main()
214 {
215     Person s1("李华", 20, "");
216     s1.show();
217     Cadre s2("李华", 20, "", "财务总监");
218     s2.show();
219     Cadre s3(s2);
220     s3.show();
221     return 0;
222 }

 

  • 如果该函数是非虚函数,那么编译器会根据指针的类型找到该函数;也就是说,指针是哪个类的类型就调用哪个类的函数。
  • 如果该函数是虚函数,并且派生类有同名的函数遮蔽它,那么编译器会根据指针的指向找到该函数;也就是说,指针指向的对象属于哪个类就调用哪个类的函数。这就是多态。
posted @ 2018-04-21 17:07  Hk_Mayfly  阅读(678)  评论(0编辑  收藏  举报