专业编程基础技术教程

网站首页 > 基础教程 正文

多态实现——虚函数与纯虚函数 多态类中的虚函数表建立在哪个阶段

ccvgpt 2024-11-12 09:53:23 基础教程 30 ℃

在 C++ 中,虚函数纯虚函数是面向对象编程的重要概念,主要用于实现多态

虚函数(Virtual Function)

虚函数是一种可以在派生类中被重写的函数。通过将基类的成员函数声明为虚函数,编译器会确保在运行时根据实际对象类型(而不是指针或引用的类型)调用该函数。这种机制称为动态绑定运行时多态。虚函数通常用于在基类中定义通用的接口,而在派生类中实现具体的功能。

多态实现——虚函数与纯虚函数 多态类中的虚函数表建立在哪个阶段

虚函数的特性

  • 在基类中使用 virtual 关键字声明函数,即该函数为虚函数。
  • 虚函数支持在派生类中重写,这样调用时会根据实际对象类型选择对应的函数。
  • 通过指针或引用调用虚函数时,会执行对象实际类型中的重写函数,而不是基类的函数。

示例

#include <iostream>

class Animal {
public:
    virtual void sound() {  // 虚函数
        std::cout << "Animal sound\n";
    }
};

class Dog : public Animal {
public:
    void sound() override {  // 重写虚函数
        std::cout << "Dog barks\n";
    }
};

class Cat : public Animal {
public:
    void sound() override {  // 重写虚函数
        std::cout << "Cat meows\n";
    }
};

int main() {
    Animal* animal1 = new Dog();
    Animal* animal2 = new Cat();

    animal1->sound();  // 输出 "Dog barks"
    animal2->sound();  // 输出 "Cat meows"

    delete animal1;
    delete animal2;
    return 0;
}

sound 是 Animal 类的虚函数,而 Dog 和 Cat 都对其进行了重写。在 main 函数中,虽然 animal1 和 animal2 的类型是 Animal*,但在调用 sound() 时,实际执行的是派生类中的实现,这就是多态

纯虚函数(Pure Virtual Function)

纯虚函数是一种在基类中声明但不提供具体实现的函数,纯虚函数的声明方式是将函数后面赋值为 0。包含纯虚函数的类称为抽象类,抽象类不能实例化,只能作为基类。纯虚函数的目的是在基类中定义接口而不提供实现,派生类必须重写该函数。

纯虚函数的特性

  • 纯虚函数在基类中不提供实现,使用 = 0 进行声明。
  • 包含纯虚函数的类不能创建对象,只能作为基类。
  • 派生类必须重写纯虚函数,否则派生类本身也会成为抽象类。

示例

#include <iostream>

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

class Dog : public Animal {
public:
    void sound() override {  // 必须重写纯虚函数
        std::cout << "Dog barks\n";
    }
};

class Cat : public Animal {
public:
    void sound() override {  // 必须重写纯虚函数
        std::cout << "Cat meows\n";
    }
};

int main() {
    Animal* animal1 = new Dog();
    Animal* animal2 = new Cat();

    animal1->sound();  // 输出 "Dog barks"
    animal2->sound();  // 输出 "Cat meows"

    delete animal1;
    delete animal2;
    return 0;
}

Animal 类中的 sound() 是一个纯虚函数,因此 Animal 是一个抽象类,不能实例化。派生类 Dog 和 Cat 必须重写 sound() 函数,以提供具体的实现。

虚函数和纯虚函数的区别

  1. 定义和实现

虚函数:在基类中定义并可能提供默认实现。

纯虚函数:在基类中定义但不提供实现,需要在派生类中实现

  1. 类的类型

含有虚函数的类不是抽象类,可以实例化对象。

含有纯虚函数的类是抽象类不能实例化

  1. 作用

虚函数:提供默认行为,可以在派生类中选择性地重写。

纯虚函数:为派生类定义接口,必须在派生类中重写。

使用场景

  • 虚函数:适用于需要在基类提供默认实现,但允许派生类根据需要重写的情况。
  • 纯虚函数:适用于定义接口的抽象类,用于创建多态接口,让派生类实现具体行为,适合框架设计。

虚函数和纯虚函数都是实现多态的工具。虚函数允许派生类重写基类的功能,而纯虚函数强制派生类提供具体实现。

最近发表
标签列表