使用多重继承来满足抽象基类

Pra*_*tic 3 c++ abstract-class multiple-inheritance mixins

为什么这不起作用?继承的函数签名是否巧妙地不正确,或者是在继承成员函数之前强制执行的抽象基类还是其他东西?这可以说服没有函数包装器吗?

#include <iostream>

struct AbsBase {
    virtual void foo() = 0;
    virtual void bar() = 0;
};

struct ProvideFoo {
    void foo() { std::cout << "foo\n"; }
};

struct ProvideBar {
    void bar() { std::cout << "bar\n"; }
};

struct Concrete : public ProvideFoo, public ProvideBar, public AbsBase {
    // I guess I could put function wrappers here... sigh...
    //void bar() {ProvideBar::bar();}
    //void foo() {ProvideFoo::foo();}
};

int main() {
    Concrete c;
    c.foo();
    c.bar();
}
Run Code Online (Sandbox Code Playgroud)

Tem*_*Rex 7

为什么你的代码无法编译

我认为downvoters对你有点苛刻,因为你通过单独的类提供两个纯虚函数的实现的理由具有一些直观的吸引力.

唉,你正在同时做两件无关的事情.ProvideFoo并且ProvideBarAbsBase抽象类完全无关.您也可以从中继承它们AbsBase,但是它们中的每一个仍然是一个抽象类.在任何一种情况下,您的当前Concrete都是一个抽象类,因为它派生自至少一个具有纯虚函数的类.您无法从此类创建对象.

修复你的代码,第一部分

最简单的方法是AbsBase完全从子类中删除子类,ProvideFooProvideBar直接从子类中删除子类.当然,现在你没有virtual内部函数Concrete,所以进一步的子类化不能轻易覆盖foobar功能.

#include <iostream>

struct ProvideFoo {
    void foo() { std::cout << "foo\n"; }
};

struct ProvideBar {
    void bar() { std::cout << "bar\n"; }
};

struct Concrete : public ProvideFoo, public ProvideBar {};

int main() {
    Concrete c;
    c.foo();
    c.bar();
}
Run Code Online (Sandbox Code Playgroud)

实例I

修复你的代码,第二部分

您还可以创建多个接口和多个具体实现,如下所示:

#include <iostream>

struct AbsFoo {
    virtual void foo() = 0;
};

struct AbsBar {
    virtual void bar() = 0;
};

struct ProvideFoo: AbsFoo {
    void foo() { std::cout << "foo\n"; }
};

struct ProvideBar: AbsBar {
    void bar() { std::cout << "bar\n"; }
};

struct Concrete : public ProvideFoo, public ProvideBar {};

int main() {
    Concrete c;
    c.foo();
    c.bar();
}
Run Code Online (Sandbox Code Playgroud)

实例II

修复你的代码,第三部分

现在的安可:您还可以使用virtual继承时,继承ProvideFooProvideBarAbsBase通过使用virtual关键字

#include <iostream>

struct AbsBase {
    virtual void foo() = 0;
    virtual void bar() = 0;
};

struct ProvideFoo: virtual AbsBase {
    void foo() { std::cout << "foo\n"; }
};

struct ProvideBar: virtual AbsBase {
    void bar() { std::cout << "bar\n"; }
};

struct Concrete : public ProvideFoo, public ProvideBar {};

int main() {
    Concrete c;
    c.foo();
    c.bar();
}
Run Code Online (Sandbox Code Playgroud)

这是非常高级的C++,如果您的类也包含成员数据,它可能变得非常复杂.我更愿意为您的代码使用第二个解决方案.

实例III