C++中的多态性通过虚函数和动态绑定来实现, 下面简单介绍一下多态的实现:

  1. 虚函数:在基类中声明虚函数,通过在成员函数前面加上virtual关键字来标识。虚函数允许子类对其进行重写(覆盖),从而实现多态。基类中的虚函数只有函数声明,没有具体的实现。
  2. 动态绑定:基于对象的类型来选择调用的函数,而不是基于指针或引用的类型。在编译时,编译器会根据指针或引用的静态类型进行函数调用;而在运行时,根据指针或引用所指向的对象的实际类型来决定调用哪个函数。这种在运行时确定调用的函数称为动态绑定。
  3. 虚函数表(vtable):编译器会为每一个包含虚函数的类生成一个虚函数表,该表存储了虚函数的地址。对象的内存布局中会包含一个指向虚函数表的指针,称为虚函数指针(vptr)。虚函数指针指向当前对象的虚函数表,通过虚函数表来找到具体的虚函数地址。
  4. 多态调用过程:当通过指针或引用调用虚函数时,首先会根据指针或引用的静态类型找到对应的虚函数表,然后根据虚函数表中的偏移量找到具体的虚函数地址,最终调用对应的函数。

示例代码:

class Animal {
public:
    virtual void sound() {
        std::cout << "动物能叫" << std::endl;
    }
};

class Dog : public Animal {
public:
    void sound() override {
        std::cout << "Dog's voice sounds like Wangwang." << std::endl;
    }
};

class Cat : public Animal {
public:
    void sound() override {
        std::cout << "Cat's voice sounds like Miaomiao." << std::endl;
    }
};

int main() {
    Animal* animalPtr;
    
    Dog dog;
    Cat cat;

    animalPtr = &dog;
    animalPtr->sound();  // 输出: Dog's voice sounds like Wangwang.

    animalPtr = &cat;
    animalPtr->sound();  // 输出: Cat's voice sounds like Miaomiao.

    return 0;
}

在上述示例中,Animal类是基类,DogCat类分别是派生类。它们都重写(覆盖)了基类的sound函数。通过基类指针animalPtr指向不同的派生类对象,并调用sound函数。在运行时,根据指针所指向的对象的实际类型来选择调用哪个函数,实现了多态性。

总之,C++中的多态通过虚函数和动态绑定来实现。虚函数允许子类对其进行重写,动态绑定根据对象的实际类型来确定调用哪个函数。使用虚函数表和虚函数指针来实现动态绑定。这种机制能够提供更灵活的代码设计和对象行为的多样性。


Totn
10 声望5 粉丝

幼稚也没关系,去实践,去经历,去思考!