C++之虚函数 Virtual Function

1. 普通虚函数(Virtual Function)

  • 定义:基类中用 virtual 声明,允许派生类 覆盖(Override)
  • 特点
    • 基类可提供默认实现。
    • 派生类可选择性覆盖(若不覆盖,则调用基类版本)。
  • 示例
    class Shape {
    public:
        virtual void draw() {
            cout << "Drawing a shape." << endl;
        }
    };
    

2. 纯虚函数(Pure Virtual Function)

  • 定义:基类中用 virtual 声明并以 = 0 结尾,强制派生类必须实现。

  • 特点:

    • 基类成为 抽象类(Abstract Class),无法实例化。
    • 用于定义接口规范,强制派生类遵守。
  • 示例

    class Shape {
    public:
        virtual void draw() = 0; // 纯虚函数
    };
    

3. 虚析构函数(Virtual Destructor)

  • 定义:基类的析构函数声明为 virtual,确保派生类对象通过基类指针删除时,能正确调用派生类的析构函数。
  • 场景:基类指针指向派生类对象时,必须使用虚析构函数以避免资源泄漏。
  • 现象:先执行派生类析构函数,再执行基类析构函数
3.1 虚构函数
#include <iostream>

// 基类
class Base {
public:
    // 虚析构函数
    virtual ~Base() {
        std::cout << "Base class destructor" << std::endl;
    }
};

// 派生类
class Derived : public Base {
public:
    ~Derived() override {
        std::cout << "Derived class destructor" << std::endl;
    }
};

int main() {
    // 通过基类指针创建派生类对象
    Base* basePtr = new Derived();

    // 删除基类指针
    delete basePtr;

    return 0;
}    
3.2 纯虚构函数
#include <iostream>


// 基类
class Base {
public:
    // 虚析构函数
//    virtual ~Base() {
//        std::cout << "Base class destructor" << std::endl;
//    }
	virtual ~Base() = 0;
};

Base::~Base()  // 必须提供实现
{
	std::cout << "Base class destructor = 0" << std::endl;
}

// 派生类
class Derived : public Base {
public:
    ~Derived() override {
        std::cout << "Derived class destructor" << std::endl;
    }
};

int main() {
    // 通过基类指针创建派生类对象
    Base* basePtr = new Derived();

    // 删除基类指针
    delete basePtr;

    return 0;
}  

4. 关键词 (C++11)

一、override

显式标记派生类中对基类虚函数的重写,强制编译器检查函数签名是否完全匹配,避免因拼写错误或参数不匹配导致意外定义新函数

二、final

修饰类:禁止类被继承(如工具类或不可变类)。
修饰虚函数:禁止派生类进一步重写该函数(如关键算法或接口)。

class Base {
public:
    virtual void log() final { // 禁止派生类覆盖
        cout << "Base log." << endl;
    }
};
#include <iostream>

// 基类
class Base {
public:
    // 虚函数
    virtual void print() {
        std::cout << "This is the Base class." << std::endl;
    }
};

// 派生类
class Derived : public Base {
public:
    // 重写基类的虚函数
    void print()final {
        std::cout << "This is the Derived class." << std::endl;
    }
};

// 派生类的派生类
/*
class Deriveder : public Derived {
public:
    // 重写基类的虚函数
    void print() override {
        std::cout << "This is the Deriveder class." << std::endl;
    }
};
*/

// 多态函数
void callPrint(Base* obj) {
    obj->print();
}

int main() {
    Base base;
    Derived derived;
	//Deriveder Deriveder;

    // 调用多态函数
    callPrint(&base);
    callPrint(&derived);
	//callPrint(&Deriveder);
	
    return 0;
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值