我如何通过抽象 class 传递虚拟方法但可选择不覆盖?

How would I pass a virtual method through an abstract class but optionally not override?

我正在尝试通过抽象 class 传递虚方法,但只有其中的一些派生 classes 覆盖基方法,而其他 运行宁原方法。

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() 方法。我该怎么做?

您在 Mammal 中不需要这个:

virtual void speak() = 0;

Human 仍然可以覆盖 speak() 就好了,而 Dog 则不必。不过请确保您使用的是 public 继承,而不是私有继承。即:

class Mammal : public Animal {

而不是:

class Mammal : Animal {

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

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

class Mammal : public Animal {
};

class Dog : public Mammal {
};

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