25.10 — 动态类型转换

早在之前的课程中,我们研究了类型转换的概念以及 static_cast 用于将变量从一种类型转换为另一种类型。在本课中,我们将继续研究另一种类型转换:dynamic_cast。 dynamic_cast 的需求 在处理多态性时,你经常会遇到以下情况:你……

25.9 — 对象切片

让我们回到之前看过的例子: #include <iostream> #include <string_view> class Base { protected: int m_value{}; public: Base(int value) : m_value{ value } { } virtual ~Base() = default; virtual std::string_view getName() const { return “Base”; } int getValue() const { return m_value; } }; class …

7.13 — 使用声明与使用指令

你可能在许多教科书和教程中都见过这个程序: #include <iostream> using namespace std; int main() { cout << “Hello world!\n”; return 0; } 如果你看到这个,快跑。你的教科书或教程可能已经过时了。在本课中,我们将探讨原因。提示 一些 IDE…

25.3 — override 和 final 说明符,以及协变返回类型

为了解决继承的一些常见挑战,C++ 有两个与继承相关的标识符:override 和 final。请注意,这些标识符不是关键字——它们是普通单词,只有在特定上下文中才具有特殊含义。C++ 标准将它们称为“具有特殊含义的标识符”,但它们通常……

9.1 — 代码测试入门

所以,你写了一个程序,它编译了,甚至看起来能工作!现在怎么办?这取决于情况。如果你编写的程序是一次性运行然后丢弃的,那么你就完成了。在这种情况下,你的程序是否适用于所有情况可能不重要——如果它……

23.5 — 依赖关系

到目前为止,我们已经探讨了 3 种类型的关系:组合、聚合和关联。我们把最简单的一种留到了最后:依赖。在日常对话中,我们用“依赖”这个词来表示一个对象在给定任务中依赖于另一个对象。例如,如果你摔断了脚,你……

23.4 — 关联

在前两课中,我们探讨了两种对象组合类型:组合和聚合。对象组合用于建模复杂对象由一个或多个简单对象(部件)构建的关系。在本课中,我们将探讨一种更弱的……