ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-07-28 13:08:15  阅读:215  来源: 互联网

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

解决方法:

为什么你的代码无法编译

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

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

修复你的代码,第一部分

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

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

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

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

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

Live Example III

标签:c,abstract-class,multiple-inheritance,mixins
来源: https://codeday.me/bug/20190728/1562012.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有