如何将虚拟方法传递给抽象类,但可以选择不重写?

时间:2019-06-09 00:01:20

标签: c++ methods overriding virtual

我正在尝试通过抽象类传递虚拟方法,但是只让其中的某些派生类覆盖基本方法,而其他类则运行原始方法。

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

1 个答案:

答案 0 :(得分:4)

您在Mammal中不需要它:

virtual void speak() = 0;

Human仍然可以覆盖speak(),而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
    {}
};