2009年1月30日

C++ Class基本架構

常常在使用C++ Class,但是常常會忘記架構,以下使用個簡單的範例來展示class的基本結構。

  1. #include <iostream>
  2. #include <string>
  3. #include <cstdlib>
  4. using namespace std;
  5. ////////////////////////////////////////////////////
  6. class Base
  7. {
  8. public:
  9.     //constructor
  10.     Base(int num=0,string str=""):
  11.         base_id(num), base_name(str){
  12.         cout<<"Base construction\n";
  13.     }
  14.  
  15.     //Destructor
  16.     //若Base class的destructor沒有設定為virtual
  17.     //則derived clss的destructor不會被呼叫,無法運作
  18.     virtual ~Base(){
  19.         cout<<"Base destroyed\n";
  20.     }
  21.  
  22.     //overloading
  23.     virtual void print(){
  24.         cout<<"base id = "<<base_id
  25.             <<" name = "<<base_name<<endl;
  26.     }
  27.  
  28.     //abstract method, 必須是virtual,否則無法compile
  29.     virtual void printall() = 0;
  30.  
  31. protected:
  32.     int base_id;
  33.     string base_name;
  34. };
  35. ////////////////////////////////////////////////////
  36. class Derived : public Base
  37. {
  38. public:
  39.     //constructor
  40.     Derived(int num=0, string str="", int val=0):
  41.         Base(num, str), derived_id(val){
  42.         cout<<"Derived construction"<<endl;
  43.     }
  44.  
  45.     //Destructor
  46.     virtual ~Derived(){
  47.         cout<<"Derived destroyed\n";
  48.     }
  49.  
  50.     virtual void print(){
  51.         cout<<"derived id = "<<derived_id<<endl;
  52.     }
  53.  
  54.     //Derived class必須實作來自Base class的abstract method
  55.     //否則在程式中class無法被implementation
  56.     void printall(){
  57.         cout<<"hello world"<<endl;
  58.     }
  59.  
  60. protected:
  61.     int derived_id;
  62. };
  63. ////////////////////////////////////////////////////
  64. int main()
  65. {
  66.     Base *ptr = new Derived(1, "derived", 2);
  67.  
  68.     ptr->print();    //call Derived print()
  69.     ptr->printall();
  70.     delete ptr;
  71.  
  72.     return EXIT_SUCCESS;
  73. }

result

  • 在建構Derived class時,會先呼叫Base class的constructor,再呼叫Derived class的constructor,而destroy object時是相反的方向。
  • 當Base class的method全部為abstract method時,可將Base class視為Java的interface來使用。