我想询问有效C++中的具体要点.
它说:
如果一个类需要像多态类一样运行,那么析构函数应该是虚拟的.它进一步补充说,由于
std::string没有虚拟析构函数,因此永远不应该从中派生出来.还std::string甚至没有设计成一个基类,忘记多态基类.
我不明白一个类中具体要求什么才有资格成为基类(不是多态的)?
我不应该从std::string类派生的唯一原因是它没有虚拟析构函数吗?为了可重用性,可以定义基类,并且多个派生类可以从中继承.那么什么使得std::string甚至没有资格成为基类?
此外,如果存在纯粹为可重用性目的而定义的基类,并且有许多派生类型,是否有任何方法可以阻止客户端执行,Base* p = new Derived()因为这些类并不是要多态地使用?
我有一个需要编码字符串的函数,它需要能够接受0x00作为有效的'字节'.我的程序需要检查字符串的长度,但是如果我传递"\x00"给std::string该length()方法返回0.
即使字符串是单个空字符,如何获得实际长度?
由于存在一个错误,我刚刚发现该代码可以在Visual Studio 17以及其他编译器上正常编译。现在我很好奇为什么?
#include <iostream>
#include <string>
std::string foo(){
return nullptr;
}
int main(){
auto s = foo();
std::cout << s << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我可以想象这是因为std::basic_string可以用a调用c'tor char*,同时返回从ptr到的隐式转换std::string(使用NULLas作为参数,然后变为poof)。我走对了吗?