禁止转换为父级,但公开父级的界面(设计问题)



我不知道如何以最优雅的方式实现(用C++表达(以下问题。假设我们有一个库,它为类PerfectCounter提供了丰富的非虚拟接口。我想要实现从PerfectCounter继承的类DisturbedCounter。新类应该公开与其父类相同的接口,例如,允许为两个类的成对实例调用一些运算符(<>、==等(。此外,我想禁止两个类之间的转换(以两种方式(。

CCD_ 7可以从CCD_。它将阻止从DisturbedCounterPerfectCounter的转换。但是,我必须在DisturbedCounter中将99%的PerfectCounterAPI显式重新声明为"公共"。这意味着将来要进行大量的编写和维护。

有没有更好的方法来解决这个问题?

我可以使用C++17。

您可以让DistrictedCounter从PerfectCounter私有继承。然后,它们之间的转换将不被允许(因为在这种情况下,DistrictedCounter不是PerfectCounter,它只是根据一个来实现(。

然后,您可以使用using指令公开PerfectCounters接口中您希望在DistrictedCounter中公开的部分,并添加您想要的任何比较运算符的实现。

当然还有其他方法,但这至少是你需要考虑的一种方法。

我不确定这是否正是您所需要的,因为扰动计数器不是从PerfectCounter继承的。它使用CRTP来避免转换,并且它应该允许您只执行每个方法一次(除了那些真正应该不同的方法(,并且您不需要基类中的using。我不擅长模板,所以这可能会被其他人拆开,但o.t.o.h.,如果不是,它可能会给你一些想法,也可能是一个可以构建的东西。缺少了很多样板。

#include <iostream>
template<class T>
struct Common {
protected:
double m_count;
public:
Common() : m_count(0) {}
Common& operator=(const Common& rhs) {
m_count = rhs.m_count;
return *this;
}
operator double () const { return m_count; }
double get() const { return m_count; }
};
// type specific implementation
struct PerfectCounter : Common<PerfectCounter> {
void count() {
m_count += 10.0;
}
};
// type specific implementation
struct DisturbedCounter : Common<DisturbedCounter> {
void count() {
m_count += 9.9;
}
};
int main() {
PerfectCounter a;
a.count();
DisturbedCounter b;
b.count();
//a = b; // error
//b = a; // error
if( a>b ) std::cout << "a>bn";
std::cout << a << " " << b << "n";
}

输出

a>b
10 9.9

最新更新