C++ 禁止转换到父级,但公开父级';s接口(设计问题)
我不知道如何以最优雅的方式实现(用C++表示)下面的问题。假设我们有一个库,提供类C++ 禁止转换到父级,但公开父级';s接口(设计问题),c++,inheritance,c++17,C++,Inheritance,C++17,我不知道如何以最优雅的方式实现(用C++表示)下面的问题。假设我们有一个库,提供类PerfectCounter,具有丰富的非虚拟接口。我想实现从PerfectCounter继承的类DisturbedCounter。新类应公开与其父类相同的接口,例如,允许为两个类的成对实例调用某些运算符(,==,等等)。此外,我想禁止两个类之间的转换(以两种方式) disturbledCounter可以从PerfectCounter私有继承。它将阻止从干扰计数器到完美计数器的转换。但是,我必须在Disturbed
PerfectCounter
,具有丰富的非虚拟接口。我想实现从PerfectCounter
继承的类DisturbedCounter
。新类应公开与其父类相同的接口,例如,允许为两个类的成对实例调用某些运算符(
,==
,等等)。此外,我想禁止两个类之间的转换(以两种方式)
disturbledCounter
可以从PerfectCounter
私有继承。它将阻止从干扰计数器
到完美计数器
的转换。但是,我必须在DisturbedCounter
中将99%的PerfectCounter
API明确地重新声明为“public”。这意味着将来需要大量的编写和维护
有没有更好的办法来解决这个问题
我可以使用C++17。您可以让DisterbedCounter从PerfectCounter私下继承。然后,它们之间的转换将不被允许(因为在这种情况下DisterbedCounter不是PerfectCounter,它只是根据一个计数器实现的) 然后,您可以使用
using
指令公开PerfectCounters接口的部分,这些部分是您希望在DisterbedCounter和任何比较运算符的插件实现中公开的
当然还有其他办法,但至少要考虑一个。 < P>我不确定这是否正是你需要的,因为干扰计数器不从PerfectCounter继承。它用于避免转换,并且应该允许您只执行一次每个方法的实现(除了那些真正应该不同的方法),并且您不需要从基类使用
。我不擅长使用模板,所以这可能会被某个人撕碎,但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>b\n";
std::cout << a << " " << b << "\n";
}
如果这些函数是虚拟函数,为什么不希望转换为父函数?如果它们不是虚拟的,那么重写它们似乎是个坏主意。@ Sergaya< C++ >完美计数器>代码>有非虚拟接口,我以前没有提到过。我们希望使用A:::*除了blargh代码>也许有一天。@n.m.确实是我在找的东西。我害羞地希望有一个简洁的C++1*结构来解决我的问题。这是我在第二段中描述的方法(可能我不够清楚)。这是一个相当乏味的解决方案,因为我必须对PerfectCounter中的每个方法使用using
。@Goofy我现在(重读时)看到了这一点-我想我的阅读能力很差。无论如何是的,很乏味,但仍然是我能想到的解决这个具体问题的最直接的方法。
a>b
10 9.9