加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:53:12 所属栏目:百科 来源:网络整理
导读:为什么这不起作用?继承的函数签名是否巧妙地不正确,或者是在继承成员函数之前强制执行的抽象基类还是其他东西?这可以说服没有函数包装器吗? #include iostreamstruct AbsBase { virtual void foo() = 0; virtual void bar() = 0;};struct ProvideFoo { vo
为什么这不起作用?继承的函数签名是否巧妙地不正确,或者是在继承成员函数之前强制执行的抽象基类还是其他东西?这可以说服没有函数包装器吗?

#include <iostream>

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

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

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

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();
}

解决方法

为什么你的代码无法编译

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

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

修复你的代码,第一部分

最简单的方法是完全从AbsBase中删除子类,并直接从ProvideFoo和ProvideBar中继承子类.当然,现在您在Concrete中没有虚函数,因此进一步的子类化不能轻易覆盖foo和bar功能.

#include <iostream>

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

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

struct Concrete : public ProvideFoo,public ProvideBar {};

int main() {
    Concrete c;
    c.foo();
    c.bar();
}

Live Example I

修复你的代码,第二部分

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

#include <iostream>

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

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

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

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

struct Concrete : public ProvideFoo,public ProvideBar {};

int main() {
    Concrete c;
    c.foo();
    c.bar();
}

Live Example II

修复你的代码,第三部分

现在对于安可:当使用virtual关键字从AbsBase继承ProvideFoo和ProvideBar时,您也可以使用虚拟继承

#include <iostream>

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

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

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

struct Concrete : public ProvideFoo,public ProvideBar {};

int main() {
    Concrete c;
    c.foo();
    c.bar();
}

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

Live Example III

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读