首页 > 解决方案 > 我将如何通过抽象类传递虚拟方法但可选择不覆盖?

问题描述

我试图通过一个抽象类传递一个虚拟方法,但只有它的一些派生类覆盖基方法,而其他类则运行原始方法。

class Animal {
    virtual void speak() {
         //generic speaking code
    }
}
class Mammal : Animal {
    virtual void speak() = 0;
    //allows speak to be overridden by derived class
}
class Dog : Mammal {
    //doesn't do anything special with speak(), should run generic speaking code
}
class Human : Mammal {
    void speak() {
        //overrides generic speaking code
    }
}

我想从 Dog 调用 speak() 来运行 Animal 的 speak() 方法,但从 Human 调用 speak() 来运行它自己的 speak() 方法。我该怎么办?

标签: c++methodsoverridingvirtual

解决方案


你不需要这个Mammal

virtual void speak() = 0;

Humanspeak()仍然可以很好地覆盖,并且Dog不必。确保您使用的是公共继承,而不是私有继承。那是:

class Mammal : public Animal {

代替:

class Mammal : Animal {

作为旁注,您应该override在覆盖虚函数时使用关键字。它有助于捕捉一些常见的错误,即认为您正在覆盖一个函数,而实际上您只是在重载它。所以你的代码应该是:

class Animal {
public:
    virtual void speak()
    {}
};

class Mammal : public Animal {
};

class Dog : public Mammal {
};

class Human : public Mammal {
public:
    void speak() override
    {}
};

推荐阅读