看过一些相关的问题,但不是这个确切的问题......
我将类分为几个主要类别,为了简单起见,我们说这四个:
值类,其中包含一些数据和一堆操作。它们可以被复制并有意义地比较相等(通过
==
预期拷贝相等)。 这些几乎总是缺少虚拟方法。唯一类,其实例具有您禁用分配和复制的标识。这些通常没有
operator==
因为您将它们作为指针而不是对象进行比较。 这些通常有很多虚拟方法,因为不存在 object-slicing 的风险因为您被迫通过指针或引用传递它们。Unique-but-Clonable Classes 禁用复制,但如果这是您真正想要的,则预先设计为支持克隆。 这些有虚方法,最重要的是那些在 virtual construction / cloning idiom 之后的方法。
容器类,继承了它们所持有的任何东西的属性。 这些往往没有虚拟方法...例如见 "Why don't STL containers have virtual destructors?" .
不管持有这种非正式的信念系统,有几次我尝试将虚拟方法添加到可复制的东西中。虽然我可能认为它“如果可行的话会很酷”,但它不可避免地会坏掉。
这让我想知道是否有人有一个真正的好例子,该类型具有虚拟方法并且不会禁用复制?
最佳答案
我拥有的唯一反例是旨在堆栈分配而不是堆分配的类。我使用它的一种方案是依赖注入(inject):
class LoggerInterface { public: virtual void log() = 0; };
class FileLogger final: public LoggerInterface { ... };
int main() {
FileLogger logger("log.txt");
callMethod(logger, ...);
}
这里的关键是 final
关键字,这意味着复制 FileLogger
不会导致对象切片。
但是,可能只是 final
将 FileLogger
变成了一个 Value 类。
注意:我知道,复制记录器似乎很奇怪......
关于c++ - 将虚拟方法放在可复制类型上是否是个好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19773793/