- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直听说你不应该从没有虚析构函数的类继承,但我并没有太在意,因为我只是不经常使用继承。即使您不想使用多态性,但您只想要一个类的所有功能,并且想要添加更多功能,这条规则是否适用?具体来说,只要我不以多态方式使用它,下面的类是否安全,具有明确定义的行为? (即不删除派生对象的基指针)
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/
我开始考虑在我 future 的项目或重构中实现控制反转容器,我想知道在正确设计依赖项时哪些原则(除了 GoF 模式)可能需要牢记在心。假设我需要构建一个简单的控制台应用程序,如果它可以访问互联网,它
假设我有一个 RxC contingency table 。这意味着有 R 行和 C 列。我想要一个维度为 RC × (R + C − 2) 的矩阵 X,其中包含行的 R − 1 “主效应”以及列的
我正在尝试使用 DKMS 为正在运行的内核 (4.4) 构 build 备树覆盖。我天真的 Makefile 如下: PWD := $(shell pwd) dtbo-y += my-awsome-o
我有一个 sencha touch 项目。我是用 phonegap 2.9 构建的,并且可以正常工作 device.uuid 返回到设备 ID。当我尝试使用 3.1 device.uuid 构建时抛出
我在安装了 Xcode 4.5.1 的 Mt Lion 上运行。 默认情况下,当我构建并部署到 iOS 5.1 设备时,显示会在我旋转设备时旋转,但当我部署到 iOS 6 模拟器或运行 iOS 的 i
我正在尝试使用 Google Analytics Reporting API v4 构建多折线图。 一张图表,其中我按每天的 session 计数为每个设备(台式机/平板电脑/移动设备)设置了一条线。
我一生都无法使用 xcode 组织者“自动设备配置”中的“团队配置配置文件”在 xcode 4.0.1 中将我的应用程序构建到我的 iPad 上。 该应用程序完美地构建到模拟器,但当我构建到 iPad
我是一名优秀的程序员,十分优秀!