gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:04:09 25 4
gpt4 key购买 nike

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

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

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

  • 唯一类,其实例具有您禁用分配和复制的标识。这些通常没有 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/

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