我怎样才能使 class 实现一个接口.... (C++)

How can I make a class implement an interface .... (C++)

...当 class 实际上确实提供了所有抽象方法的实现,但不是 "formally" 实现了接口?

假设我有以下内容:

class AInterface {
    public:
        virtual void mem_func()=0;
        virtual ~AInterface(){}
};

void AFunction(AInterface* i){};

class BClass {
    public:
        void mem_func(){}
        virtual ~BClass(){}
};

我无法更改其中任何内容,但我想使用 class BClass 的对象来调用 AFunction。

其实我想写点像

class MyABClass : public BClass,public AInterface {};

但这没有帮助(class 只是继承了这两种方法并且是抽象的)。我猜想做到这一点的一种方法是写一些类似

的东西
class MyABClass : public AInterface {
    public:
        void mem_func(){a.mem_func();}
    private:
        BClass a;
}

这很好,但我想知道是否可以节省一些写作,或者是否有更好的方法来处理这种情况。

你的第一次尝试几乎是正确的

class MyClass : public AClass,public AInterface {};

问题是 MyClass 不知道 AClass::A() 满足 AInterface::A()=0 提出的要求。像这样给它一点帮助

class MyClass : public AClass, public AInterface {
    void A() {AClass::A();}
};

我会使用与您上一个代码片段非常相似的方法

class MyABClass : public AInterface {
    public:
        void MyABClass(BClass &_a)
            : a(_a)
        {}
        void mem_func(){a.mem_func();}
    private:
        BClass &a;
}

这是一种设计模式,称为 Adapter (with delegation). Maybe you also want to read about the Proxy 模式。

Update(考虑 Kenny 的评论):是否将 BClass 作为参考或副本传递是值得商榷的。这取决于你想要什么。如果你想要一个包装器来方便地改变原始 BClass 实例,那么使用 BClass & 作为构造函数参数。另一方面,如果一个副本就足够了,那么只使用 BClass 而没有符号 &。好吧,if 复制构造函数可用。最后,在使用可能会产生副作用的引用时必须注意(同样,可能需要也可能不需要)。