OOP 多態/虛函數

//  main.cpp
//  OOP
//  虛函數容許繼承層次結構中絕大多數特定版本的成員函數被選擇執行,虛函數使多態成爲可能。
//  Created by mac on 2019/4/8.
//  Copyright © 2019年 mac. All rights reserved.
#include <iostream>
using namespace std;
class Class1{
public:
    Class1(){}
    ~Class1(){}
    virtual void f(){
        cout<<"Function f() in Class1"<<endl;
    }
    void g(){
        cout<<"Function g() in Calss1"<<endl;
    }
private:
    int a;
};

//寫個類模版
template <class genType>
class genClass {
public:
    genClass(){}
    ~genClass(){}
    virtual void f(){
        cout<<"Function f() in Class2"<<endl;
    }
    void g(){
        cout<<"Function g() in Class2"<<endl;
    }
private:
    genType a;
};

class Class3{
public:
    Class3(){}
    ~Class3(){}
    //寫個函數模版
    template <class genType>
    void h(genType a) {
        cout<<"Function h() in Class3"<<endl;
    }
private:
    
};


int main(int argc, const char * argv[]) {
    Class1 object1,*p;
    genClass<int> object2;
    Class3 object3,*q=&object3;
    p=&object1; //P指向object1
    p->f();
    p->g();
    
    p=(Class1 *)&object2;// p指向object2 而且對類指針進行強制類型轉換
    p->f();
    p->g();
    
    p=(Class1*)&object3; //p指向object3 而且對類指針進行強制類型轉換
    
    //p->f();//編譯成功,運行出錯。
    p->g(); // 輸出: Function g() in Calss1
   // p->h(); //編譯出錯,在Class1 中找不到h
    
    //測試一下類Class3中的函數模版怎麼用
    q->h(3);  // 輸出: Function h() in Class3
    q->h("jjjdscdjd"); // 輸出: Function h() in Class3
    return 0;
}

運行結果

Function f() in Class1
Function g() in Calss1
Function f() in Class2
Function g() in Calss1
Function g() in Calss1
Function h() in Class3
Function h() in Class3
Program ended with exit code: 0ios

Tips

  • 對於編譯器來講,是否在Class3中定義了h()並不重要(不論是否爲虛函數)。
  • 在C++中,動態綁定是經過將成員函數聲明爲virtual來實現的。
  • 友元是一個不屬於類成員的函數,可是他有權訪問該類的私有成員,使用友元函數(friend)違背信息隱藏的原則。
相關文章
相關標籤/搜索