26.x — 第 26 章总结与测验
模板允许我们使用占位符类型编写函数或类,这样我们就可以使用不同的类型来生成相同版本的函数或类。已被实例化的函数或类称为函数或类实例。所有模板函数或类都必须以 … 开头
模板允许我们使用占位符类型编写函数或类,这样我们就可以使用不同的类型来生成相同版本的函数或类。已被实例化的函数或类称为函数或类实例。所有模板函数或类都必须以 … 开头
在上一课中,我们看了一个简单的模板化 Storage 类,以及一个针对 double 类型的特化: #include <iostream> template <typename T> class Storage { private: T m_value {}; public: Storage(T value) : m_value { value } { } void print() { std::cout << m_value << …
当为给定类型实例化函数模板时,编译器会根据模板函数生成一个副本,并将模板类型参数替换为变量声明中使用的实际类型。这意味着特定函数对于每种实例化的类型都将具有相同的实现细节(只是 …)
至此,我们对 C++ 继承和虚函数的探索之旅也告一段落。亲爱的读者,请不要担心,在我们继续前进的过程中,C++ 还有许多其他领域值得探索。章节总结 C++ 允许您将基类指针和引用设置为派生对象。这 …
考虑以下使用虚函数的程序: #include <iostream> class Base { public: virtual void print() const { std::cout << “Base”; } }; class Derived : public Base { public: void print() const override { std::cout << “Derived”; } }; int main() { Derived d{}; Base& …
早在本课,我们就探讨了类型转换的概念,以及使用 static_cast 将变量从一种类型转换为另一种类型。在本课中,我们将继续探讨另一种类型转换:dynamic_cast。dynamic_cast 的必要性 在处理多态性时,您会经常遇到以下情况 …
让我们回到之前看过的例子: #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 …
您可能在很多教科书和教程中见过这个程序: #include <iostream> using namespace std; int main() { cout << “Hello world!\n”; return 0; } 如果您看到这个,请运行。您的教科书或教程可能已过时。在本课中,我们将探讨原因。提示 一些 IDE …
为了解决继承的一些常见挑战,C++ 有两个与继承相关的标识符:override 和 final。请注意,这些标识符不是关键字——它们是普通单词,只有在特定上下文中才具有特殊含义。C++ 标准称它们为“具有特殊含义的标识符”,但它们通常被称为 …