亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C++ 虚函数完全指南:概念、实例与 override 关键字

C++ 虚函数完全指南

本教程通过代码示例详解 C++ 虚函数的目的、多态机制、override 关键字用法及实际应用场景。

虚函数是预期被派生类重写的基类成员函数。声明为 virtual 后,即使通过基类指针/引用访问,也会调用最派生类的实现。

若基类成员非虚,通过基类指针调用永远执行基类版本,无论实际对象类型。例如:

class Base {
public:
    void print() { /* 基类实现 */ }
};
class Derived : public Base {
public:
    void print() { /* 派生实现 */ }
};

下面程序中,Base* 指向 Derived 实例,却调用基类版本:

int main() {
    Derived derived1;
    Base* base1 = &derived1;
    base1->print(); // 调用 Base::print()
    return 0;
}

为实现多态,需在基类声明 virtual:

class Base {
public:
    virtual void print() { /* 基类实现 */ }
};

虚函数是 C++ 多态核心。深度内容请见 C++ 多态指南。


示例 1:虚函数基本用法

#include <iostream>
using namespace std;

class Base {
public:
    virtual void print() {
        cout << "Base Function" << endl;
    }
};

class Derived : public Base {
public:
    void print() override {
        cout << "Derived Function" << endl;
    }
};

int main() {
    Derived derived1;
    Base* base1 = &derived1;
    base1->print();  // 输出 Derived Function
    return 0;
}

输出

Derived Function

因 Base::print 为虚函数,通过基类指针调用仍分发到 Derived::print。

C++ 虚函数完全指南:概念、实例与 override 关键字

C++ override 标识符

C++11 引入 override 关键字,强制编译器验证函数确实重写了虚基类成员,防止意外错误重写。

示例:

class Base {
public:
    virtual void print() { /* 基类实现 */ }
};
class Derived : public Base {
public:
    void print() override { /* 派生实现 */ }
};

类外定义时:

class Derived : public Base {
public:
    void print() override;  // 声明
};
void Derived::print() { /* 实现 */ }

安全使用 override

无 override 时,拼写错误或签名不匹配会静默创建新函数而非重写,导致隐蔽 bug。加上 override 后编译器直接报错。常见陷阱:


虚函数实际应用场景

以 Animal 基类及派生 Dog、Cat 为例,每个类含 type 成员由构造函数初始化。

class Animal {
private:
    string type;
public:
    Animal() : type("Animal") {}
    virtual string getType() const { return type; }
};

class Dog : public Animal {
private:
    string type;
public:
    Dog() : type("Dog") {}
    string getType() const override { return type; }
};

class Cat : public Animal {
private:
    string type;
public:
    Cat() : type("Cat") {}
    string getType() const override { return type; }
};

有了虚函数 getType(),单一辅助函数即可打印任意动物:

void print(Animal* ani) {
    cout << "Animal: " << ani->getType() << endl;
}

main() 中使用:

int main() {
    Animal* animal1 = new Animal();
    Animal* dog1 = new Dog();
    Animal* cat1 = new Cat();
    print(animal1);
    print(dog1);
    print(cat1);
    delete animal1;
    delete dog1;
    delete cat1;
    return 0;
}

输出

Animal: Animal
Animal: Dog
Animal: Cat

将 getType() 声明为虚函数,避免在每个派生类重复 print() 逻辑,并确保访问正确的 type。

C语言

  1. C++数组传递给函数实战指南
  2. C++类与对象:面向对象编程实战指南
  3. C++ 友元函数与友元类:突破访问控制的利器
  4. C++ 类模板实战指南:编写灵活的类型无关代码
  5. C++ 函数详解:从声明到调用的实战指南
  6. C 语言函数详解:定义、声明、调用与参数传递
  7. C++存储类别全解析:auto/register/static/extern/mutable作用域与生命周期
  8. C++重载机制深度解析:函数重载与运算符重载全攻略
  9. C++多态实战指南:虚函数、动态绑定与纯虚函数
  10. C++数据抽象实战:接口与实现分离的设计艺术
  11. C++数据封装:守护代码安全的核心机制
  12. 掌握Verilog函数:高效RTL设计的复用利器