c++ - 将虚拟方法放在可复制类型上是否是个好主意?

标签 c++ copy clone virtual-functions object-slicing

看过一些相关的问题,但不是这个确切的问题......

我将类分为几个主要类别,为了简单起见,我们说这四个:

  • 值类,其中包含一些数据和一堆操作。它们可以被复制并有意义地比较相等(通过 == 预期拷贝相等)。 这些几乎总是缺少虚拟方法。

  • 唯一类,其实例具有您禁用分配和复制的标识。这些通常没有 operator== 因为您将它们作为指针而不是对象进行比较。 这些通常有很多虚拟方法,因为不存在 的风险因为您被迫通过指针或引用传递它们。

  • 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 不会导致对象切片。

但是,可能只是 finalFileLogger 变成了一个 Value 类。

注意:我知道,复制记录器似乎很奇怪......

关于c++ - 将虚拟方法放在可复制类型上是否是个好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19773793/

相关文章:

c++ - 多线程。如何平等共享公共(public)资源?

linux - 循环复制时无法评估 dir

c++ - 将多个文件中的信息添加到一个文件中 C++

java - 为什么 System.arraycopy() 函数不创建副本而是返回对同一数组的引用?

c++ - 如何对此进行改进?

c++ - 类变量是否包含在 7 +- 2 准则中?

java - Java.lang.Cloneable 接口(interface)指南的问题

git - 克隆空的、*裸* git 存储库的最直接方法是什么?

c++ - 如何使用模板将变量传递给具有任何签名的函数?

formatting - 从gedit复制到开放办公室时如何保持格式?