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)
我认为downvoters对你有点苛刻,因为你通过单独的类提供两个纯虚函数的实现的理由具有一些直观的吸引力.
唉,你正在同时做两件无关的事情.ProvideFoo并且ProvideBar与AbsBase抽象类完全无关.您也可以从中继承它们AbsBase,但是它们中的每一个仍然是一个抽象类.在任何一种情况下,您的当前Concrete都是一个抽象类,因为它派生自至少一个具有纯虚函数的类.您无法从此类创建对象.
最简单的方法是AbsBase完全从子类中删除子类,ProvideFoo并ProvideBar直接从子类中删除子类.当然,现在你没有virtual内部函数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();
}
Run Code Online (Sandbox Code Playgroud)
您还可以创建多个接口和多个具体实现,如下所示:
#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)
现在的安可:您还可以使用virtual继承时,继承ProvideFoo并ProvideBar从AbsBase通过使用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++,如果您的类也包含成员数据,它可能变得非常复杂.我更愿意为您的代码使用第二个解决方案.
| 归档时间: |
|
| 查看次数: |
156 次 |
| 最近记录: |