C++ 禁止转换到父级,但公开父级';s接口(设计问题)

C++ 禁止转换到父级,但公开父级';s接口(设计问题),c++,inheritance,c++17,C++,Inheritance,C++17,我不知道如何以最优雅的方式实现(用C++表示)下面的问题。假设我们有一个库,提供类PerfectCounter,具有丰富的非虚拟接口。我想实现从PerfectCounter继承的类DisturbedCounter。新类应公开与其父类相同的接口,例如,允许为两个类的成对实例调用某些运算符(,==,等等)。此外,我想禁止两个类之间的转换(以两种方式) disturbledCounter可以从PerfectCounter私有继承。它将阻止从干扰计数器到完美计数器的转换。但是,我必须在Disturbed

我不知道如何以最优雅的方式实现(用C++表示)下面的问题。假设我们有一个库,提供类
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