首页 > 解决方案 > C++中的函数重载和继承

问题描述

假设我有公开派生自基类 Dog 的 Bulldog 和 Labrador 类,并且我有一个函数,例如不同类的方法,称为奖励,我希望它为 Dog 和 Bulldog 类的对象或为Bulldog 和 Labrador 类的对象。对于 C++ 开发人员来说,最好的方法是什么?

我知道如果 Dog 有任何虚拟功能,那么我可以dynamic_cast用于此目的。那是你会推荐的吗?如果不是,您认为最好的方法是什么?

标签: c++c++17

解决方案


直接的方法是使用多态从reward(const Dog& dog)函数(自由函数/其他类)委托给Dog接口的虚函数,使用提供Dog的可以多态分派虚Dog方法的引用。例如:

#include <iostream>

struct Dog {
    Dog() {}
    virtual ~Dog() {}
    virtual void reward() const { 
        std::cout << "Default dog reward.\n"; 
    }
};

struct Bulldog : public Dog {
    Bulldog() {}
    ~Bulldog() override {}
    void reward() const override {
        std::cout << "Bulldog reward.\n"; 
    }
};

void reward(const Dog& dog) {
    dog.reward();    
}

int main() {
    reward(Dog{});     // Default dog reward.
    reward(Bulldog{}); // Bulldog reward.
    return 0;
}

推荐阅读