【发布时间】:2021-01-18 13:02:15
【问题描述】:
我有以下非常普遍的问题,但我还没有找到令人满意的解决方案:
所以我想要两个类A和AData基本相同,只是后者有一个附加属性data并且每个类都支持一个函数foo(),这是不同的,因为它取决于存在的附加数据。
愚蠢的解决方案是复制整个类并稍微更改它,但这会导致代码重复并且难以维护。使用 std::optional 或指针会导致额外的检查,从而导致运行时开销,对吧?
我的问题是,是否有一种方法可以获得与仅复制代码而无需实际代码复制相同的运行时性能?我目前的解决方案是让AData成为派生类,并声明为A的朋友,然后重写虚函数foo(),但由于使用friend,我不喜欢这种做法。
【问题讨论】:
-
为什么要声明为好友?继承的重点是解决您提到的“问题”还是我遗漏了什么?也许你可以把它放在一个我们(或只有我)能更好理解的小代码示例中
-
您没有
AData的任何原因源自A? -
因为函数
foo()在这两种情况下都需要访问私有成员。我可能应该澄清一下。 -
你不能保护私有成员吗?
-
顺便说一句:使用 std::optional 或 std::variant 可能与调用 vtable 具有相同的开销。它几乎不依赖于编译器的优化。对我来说,真正的用例是什么还不清楚!使用派生类和虚方法就可以了,不需要“朋友”。
标签: c++