c++知識學習 (6)

純虛成員函數(virtual)ios

純虛函數只包含藉口的聲明,由子類負責實現函數

類如:this

virtual void info () const=0;spa

包涵純虛函數的類稱爲抽象類,抽象類不可實例化。指針

若是派生類繼承了抽象類,而不實現純虛函數的話,仍然是抽象類,不能實例化,code

只有實現了全部的純虛函數,派生類才能夠實例化。對象

 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 };
50 
51 class Student:public Person{
52 private:
53     float score;
54 public:
55    // void info() const;
56     Student();
57     ~Student();
58 };
59 
60 class Worker:public Person{
61 public :
62     void info() const;
63 };
64 #endif /* defined(__ArrayTest__Person__) */
  1 //
  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 
106 //--------------student----------
107 //-------------函數名字同樣:函數覆蓋----------------
108 //void Student::info() const{
109 //   // printf("%s\n%d\n%c\n%d %.2f\n",name,age,sex,weight,score);
110 //   // Person::info();
111 //    //printf("%.2f\n",score);
112 //    printf(" this is a student\n");
113 //
114 //}
115 //---------子類的構造函數:不須要再調用父類的構造函數------
116 Student::Student(){
117     score=1.00f;
118 
119 }
120 Student::~Student(){
121     printf(" call the functon ~Student()析構函數 \n");
122 
123 }
124 
125 void Worker::info() const{
126     printf(" this is a worker\n");
127 
128 }
 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 void sayhi(Person * per){
15     per->info();
16 }
17 int main()
18 {
19     //---person類如今是抽象類,不能實例化-------
20     //Person per=Person();
21     
22     //----若是student繼承了person,而不實現純虛函數的話,仍然是抽象類,不能實例化------
23     //Student stu = Student();
24     
25     Worker wor= Worker();
26     
27 }

輸出:blog

call the functon Person()繼承

call the functon ~Person()析構函數 內存

相關文章
相關標籤/搜索