作者回复: 可以尝试把平时用 Python、Bash 写的小工具改成用 C++。使用现代 C++,这种处理也不会太麻烦。
还有就是小的网络应用、数据处理应用等等。Leetcode 是考算法的,对语言技巧是没啥帮助。
作者回复: 思考题有些是没有固定答案的,就是希望大家去思考一下。多态的分类也有很多种。包含多态、参数多态和重载多态都是常见的提法,但强制多态这个说法我不熟,查了一下才确定有这种说法,感觉和一般的多态这个词的理解还是有点差异的……
就这第二题而言,也是希望大家去比较学习过的其他语言。这基本上取决于语言本身在类型方面的特性。
以 Python 为例,它是动态类型的语言。所以它不会有真正的静态多态。但和静态类型的面向对象语言(如 Java)不同,它的运行期多态不需要继承。没有参数化多态初看是个缺陷,但由于 Python 的动态参数系统允许默认参数和可变参数,并没有什么参数化多态能做得到而 Python 做不到的事。
作者回复: 还不够全面。可以读读参考资料。
作者回复: decltype 得到的是编译期的类型。你需要的是运行期的类型,C++ 里挺有争议(跟异常类似)的功能——RTTI。(还是要强调一句,你应该考虑是否用虚函数可以达到你需要的功能。很多项目,如 Google 的,会禁用 RTTI。)
你可以用 dynamic_cast 来转换成你需要的指针类型,如果类型不对,会得到空指针。你也可以用 typeid 直接来获取对象的实际类型。下面的代码演示一下(需要 Boost;没有安装 Boost 请自行调整,也只是不能输出友好类名而已):
#include <iostream>
#include <typeinfo>
#include <boost/core/demangle.hpp>
using namespace std;
using boost::core::demangle;
class shape {
public:
virtual ~shape() {}
};
class circle : public shape {
};
int main()
{
shape* ptr = new circle();
auto& type = typeid(*ptr);
cout << type.name() << endl;
cout << demangle(type.name()) << endl;
cout << boolalpha;
cout << (type == typeid(shape) ? "is shape\n" : "");
cout << (type == typeid(circle) ? "is circle\n" : "");
delete ptr;
}
在 GCC 下的输出:
6circle
circle
is circle
作者回复: 是的,这是个大坑,所以Herb建议对函数用重载就行了,不会有惊讶的行为。
作者回复: 可以看看其他的一些读者评论。
作者回复: sort不一定是快速排序,但通用的高性能排序算法一般都要求随机访问。sort解决的是通用情况。list::sort 则解决一种不能随机访问的特殊情况。
作者回复: 想一想:
为什么要继承?继承的话,能带来什么好处?
作者回复: 具体一点吧。哪一题你特别想知道又没有正确的回答?😎
作者回复: 1. 一般而言,不应该去修改别人的类。容易出问题。所以不能添加成员函数。
2. 模板参数可以是类型,也可以是常数表达式,包括整数类型常数、枚举、指针、引用。
3. 重载比特化优先。一般而言,函数特化是不推荐的。具体看参考资料 3。
作者回复: 静态语言的鸭子类型和动态语言还是有区别的。毕竟静态语言,如 C++,需要在编译时绑定所有的符号,否则就会出错……下面还会有例子,和 C++ 如何试图解决、改善这些问题的。编译期行为要讲上很多讲的。