如果其中一个方法在子 class 中有覆盖,C++ 是否有办法强制覆盖一组方法?

C++ is there a way to force a set of methods to be overriden, if one of them have an override in child class?

这是一个设计问题。 所以,我得到了一个带有很多纯虚方法的抽象class。有时,我意识到我不需要重写这些方法,因为我对这些功能不感兴趣。所以我从纯虚(=0)变成了一个简单的可重写的空方法。但是现在,子 class 可以覆盖一个方法,但不能覆盖与之相关的另一个方法。这可能会导致问题...有没有一种很好的方法可以强制编译器说 "if you override this method, you should override this one too !" ?

一个简单的解决方案是保留抽象 class 并有一个默认子 class,如下所示:

class AbstractMap<TKey, TValue> {
public:
    virtual TValue Get(TKey&& key) = 0;
    virtual bool TryGet(TKey&& key, TValue& result) = 0;
};


class PartiallyImplementedMap<TKey, TValue> : public AbstractMap<TKey, TValue> {
public:
    TValue Get(TKey&& key) override {
        TValue result;
        if (TryGet(std::forward<TKey>(key), result)) {
            return result;
        }
        throw KeyNotFoundException();
    };
};

现在您可以从 PartiallyImplementedMap 继承并且仅在默认实现满足您的情况下才实现 TryGet。否则你可以从 AbstractMap 继承并实现整个东西。

使用混合 类。

您可以使用混合 类 来采用相关方法集的实现。在此处阅读有关混合的信息(即使这是一个 Python 问题):

What is a mixin, and why are they useful?

您在以下情况下使用混音...

  • You want to provide a lot of optional features for a class.
  • You want to use one particular feature in a lot of different classes.

这正是你的情况。所以,也许是这样的:

class Person { /* ... */ } ;

template <transportation_t MeansOfTransport>
class GetsAroundBy: Person {  /* ... */ };

template <domicile_kind_t DomicileKind>
class LivesIn : Person {  /* ... */ };


class Urbanite : Person, LivesIn<ApartmentBuilding>, GetsAroundBy<Metro> {  /* ... */ };
class SteppePerson : Person, LivesIn<Yurt>, GetsAroundBy<Horse> {  /* ... */ };