我正在尝试通过抽象类传递虚拟方法,但是只让其中的某些派生类覆盖基本方法,而其他类则运行原始方法。
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()方法。我该怎么办?
答案 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
{}
};