iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0
自我挑戰組

C++入門即放棄系列 第 23

[DAY23]真真假假?

  • 分享至 

  • xImage
  •  

虛擬函式是甚麼?

📌 父類別定義某個函式為 virtual,子類別就可以改寫它

  • 執行時,會根據物件實際型別,決定要呼叫哪個版本
  • 這就是 多型 (polymorphism) 的核心
#include <iostream>
using namespace std;
class Character 
{
	public:
	    virtual void attack() 
	    {
	        cout << "角色->攻擊!" << endl;
	    }
};
class Warrior : public Character 
{
	public:
	    void attack() override 
	    {
	        cout << "勇者->揮劍!" << endl;
	    }
};
class Mage : public Character 
{
	public:
	    void attack() override 
	    {
	        cout << "法師->火球術!" << endl;
	    }
};
int main() 
{
    Character *c1 = new Warrior();
    Character *c2 = new Mage();
    c1->attack(); 
    c2->attack(); 
    delete c1;
    delete c2;
    return 0;
}

抽象類別是甚麼?

📌父類別中有純虛擬函式 (pure virtual function),這個類別就變成抽象類別

  • 抽象類別不能直接建立物件,只能讓子類別去繼承並「實作」函式
  • 用來設計「介面規格」,讓不同子類別去決定細節
#include <iostream>
using namespace std;
class Character 
{
	public:
	    virtual void attack() = 0;
};
class Warrior : public Character 
{
	public:
	    void attack() override 
	    {
	        cout << "勇者->揮劍!" << endl;
	    }
};
class Mage : public Character 
{
	public:
	    void attack() override 
	    {
	        cout << "法師->火球術!" << endl;
	    }
};
int main() 
{
    Character *team[2];
    team[0] = new Warrior();
    team[1] = new Mage();
    for (int i = 0; i < 2; i++) 
    {
        team[i]->attack();
    }
    for (int i = 0; i < 2; i++) 
    {
        delete team[i];
    }
    return 0;
}

結論

📌 虛擬函式 → 根據物件實際型別,呼叫對應的實作,這就是多型的精髓

📌 抽象類別 → 提供一個「設計規格」

強制子類別去定義特定功能,確保系統架構的一致性


上一篇
[DAY22]學會了如何共享!
系列文
C++入門即放棄23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言