在Effective C ++的第42页第2章中,作者给出了一个从std::string
(具有非虚拟析构函数)派生类的示例,然后delete
一个实例通过基指针派生类,以及这是如何未定义的行为。
这很好,所有,但他给出的例子甚至没有编译,并且完全不相关的原因。在这里,我尽可能地重新编写了本书中的代码,以获得最小的工作示例:
#include <string>
#include <new>
class SpecialString: public std::string{};
int main(){
SpecialString *pss = new SpecialString("Impending Doom");
std::string *ps = pss;
delete ps;
return 0;
}
但是,构建SpecialString
的行不会在我的GCC上编译,因为它正在尝试将const char*
"Impending Doom"
转换为const SpecialString&
,而不是调用{{ 1}},这就是我猜这本书所期望的。我的假设在这里有什么问题吗?