gpt4 book ai didi

c++ - 从没有虚拟析构函数的类继承

转载 作者:可可西里 更新时间:2023-11-01 18:11:06 27 4
gpt4 key购买 nike

我一直听说你不应该从没有虚析构函数的类继承,但我并没有太在意,因为我只是不经常使用继承。即使您不想使用多态性,但您只想要一个类的所有功能,并且想要添加更多功能,这条规则是否适用?具体来说,只要我不以多态方式使用它,下面的类是否安全,具有明确定义的行为? (即不删除派生对象的基指针)

template<typename T>
class SomewhatSafeVector : public std::vector<T>
{
public:
typedef std::vector<T> base;

T& operator[](unsigned n) {
if (n >= base::size())
{
throw IndexOutOfBounds();
}
return base::operator[](n);
}
};

最佳答案

I've always heard that you shouldn't inherit from a class without virtual destructors

这是给初学者的一条经验法则,因为解释所有错综复杂的内容会花费太多时间,而且实际上只给他们一些始终有效的基线会更安全(而且对于练习计划来说成本也不高) (虽然可能有点矫枉过正)。

您可以在没有 virtual 的情况下完美地使用继承基类中的析构函数。另一方面,如果基类没有 virtual方法,那么继承可能是完成这项工作的错误工具。 例如:在你的情况下,如果我使用 SafeVector<T> sv; sv[3];那么它是安全的,但是如果我这样做std::vector<T>& v = sv; v[3];它不是...这是因为您只是隐藏基类方法,而不是覆盖它(提高您的警告级别,他们会让您知道)。

这里正确的方法是使用组合,然后为您真正使用的那些方法创建转发方法到实现成员。在实践中,它变得很累,因为 C++ 不支持委托(delegate)(using attribute.insert;),所以很多人求助于继承...

另一种选择是提供更安全的方法作为免费方法,因为您始终可以不受限制地添加免费方法。对于具有“OO”思维方式的人来说,它可能感觉不那么地道,而且有些运算符不能这样添加。

关于c++ - 从没有虚拟析构函数的类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9909439/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com