...当该类确实为所有抽象方法提供实现,但不是“正式”实现该接口(interface)时?

可以说我有以下几点:

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

void AFunction(AInterface* i){};

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

并且我无法更改其中任何一个,但是我想使用BClass类的对象来调用AFunction。

其实我想写些类似的东西
class MyABClass : public BClass,public AInterface {};

但这无济于事(该类仅继承了这两种方法并且是抽象的)。我想做到这一点的一种方法是写类似
class MyABClass : public AInterface {
    public:
        void mem_func(){a.mem_func();}
    private:
        BClass a;
}

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

最佳答案

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

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

这是一种设计模式,称为Adapter(带有委派)。也许您还想阅读有关Proxy模式的信息。

更新(考虑肯尼的评论):是否通过BClass作为引用或副本是有争议的。这取决于您想要什么。如果您希望使用包装器方便地更改原始BClass实例,则可以使用BClass &作为构造函数参数。另一方面,如果副本足够,则仅使用BClass而不使用&符号&。好吧,如果有副本构造函数可用。最后,在使用可能会产生副作用的引用文献时,您必须要注意(可能还是不希望出现的)。

10-08 13:43