c++ - 我将如何通过抽象类传递虚拟方法但可选择不覆盖?
问题描述
我试图通过一个抽象类传递一个虚拟方法,但只有它的一些派生类覆盖基方法,而其他类则运行原始方法。
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
不必。确保您使用的是公共继承,而不是私有继承。那是:
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
{}
};
推荐阅读
- java - Gradle 应用程序插件将命令行参数传递给使用 intellij 运行配置(Gradle 4.10)进行编程
- jquery - jQuery按月过滤数据
- openid-connect - 如何更改 Keycloak OpenID Connect Java 适配器生成的身份验证 URL?
- reactjs - Heroku 不在 Create React App 文件夹中运行构建脚本
- javascript - 从 Json 到“JSON 对象中的数组”的确切特定值 REACTjs
- javascript - React 中异步锚点的 onClick 事件
- javascript - 将代码从本地环境部署到 Google Action/Dialogflow:没有任何反应
- javascript - Intersection Observer 未在 FF 中运行
- node.js - Eureka 与 Node-Js 客户端注册成功但心跳失败(总是重新注册)
- c++ - 重载 -> 用于指针和非指针类型的运算符