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

时间:2018-11-06 19:05:12

标签: c++ inheritance c++17

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

DisturbedCounter可以从PerfectCounter私有继承。它将阻止从DisturbedCounterPerfectCounter的转换。但是,我必须在PerfectCounter中将DisturbedCounter API的99%明确声明为“ public”。这意味着将来需要进行大量的编写和维护。

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

我可以使用C ++ 17。

2 个答案:

答案 0 :(得分:0)

您可以让DisturbedCounter从PerfectCounter私下继承。然后将不允许它们之间进行转换(因为在这种情况下DisturbedCounter并不是PerfectCounter,因此仅根据一个实现)。

然后,您可以使用using指令公开公开您想要在DisturbedCounter中公开提供的PerfectCounters接口的各个部分,并添加所需的任何比较运算符的实现。

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

答案 1 :(得分:0)

我不确定这是否正是您所需要的,因为DisturbedCounter不会从PerfectCounter继承。它使用CRTP来避免转换,它应该只允许您一次执行每个方法(真正不同的方法除外),并且您不需要基类的using 。我对模板不太满意,因此可能会被某人撕碎,但是,如果不是,它可能会给您一些想法,并且可能会有所建树。很多样板都丢失了。

#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";
}

输出

a>b
10 9.9