Pin-Jiun / Programming-Language-CPP

It's the note/experience about C++, and I have the basic ability of C.
0 stars 0 forks source link

3.1-Inheritence #3

Open Pin-Jiun opened 1 year ago

Pin-Jiun commented 1 year ago

繼承(Inheritance)

同一所學校的學生,有許多主修的科目,例如化學系的學生ChemistryStudent和電腦科學的學生CSStudent 此時就可以使用ChemistryStudent去繼承Student,不用再重新創建一個新的類別

class ChemistryStudent : public Student{
};

subclass Inherit superclass subclass會自動取得superclass除私有特質外的全部特質,做到程式碼再用(reuse)

C++支援的繼承關係為:

各種修飾繼承class後Member修飾狀況

class ChemistryStudent : A Student 表示ChemistryStudent各成員至少都有A等級的修飾

image

接下來的討論以public inheritance為主

ChemistryStudent class 繼承 Student class

建構子是無法直接被繼承的 此時一定需要有建構子,且要設定成public

class ChemistryStudent : public Student{
public:
  ChemistryStudent(){ 
  }  
};

為了程式碼的再利用,constructor繼承父類別

#include <iostream>
#include <string>
using namespace std;

class Student{
private:
  string Name;
  int Age;
  float GPA;

public:  
  //constructor
  Student(string name, int age){
    Name = name;
    Age = age;
  }
};

class ChemistryStudent : public Student{
public:
  ChemistryStudent(string name, int age):Student(name, age){
  }
};

int main()
{
    Student Amy("Amy Lin",30);
    ChemistryStudent Jim("Jim Liu", 20);
    return 0;
}

成員取用的例子

class ChemistryStudent : public Student{
public:
  ChemistryStudent(string name, int age):Student(name, age){
  }

  void RunColumn(){
    cout << Name << " is running column.\n";  error
  }
};

此時RunColumn()是無法取用Name這個成員的 因為Name是屬於父類別的private,是沒有繼承到此屬性的

error: ‘std::string Student::Name’ is private within this context

解決此方法是將 string Name; 移至 protected 屬性,ChemistryStudent就可以使用繼承的Name

class Student{
protected:
  string Name;
};

class ChemistryStudent : public Student{
public:
  ChemistryStudent(string name, int age):Student(name, age){
  }

  void RunColumn(){
    cout << Name << " is running column.\n";  
  }
};