#include <stdio.h>
struct Base
{
virtual void thatSomething() = 0;
void doSomething() {thatSomething(); }
};
struct DerOne : Base
{
virtual void thatSomething() override {std::puts("DerOne"); }
};
struct DerTwo : Base
{
virtual void thatSomething() override {std::puts("DerTwo"); }
};
struct Joined : DerOne, DerTwo
{
Joined()
{
Base::doSomething();
}
};
int main()
{
Joined j;
return 0;
}
输出:
DerOne
为什么只有thatSomething
的{{1}}被调用?我希望它被称为DerOne
的两个父类。
@hvd提到,对于多重继承,我有多个Joined
实例。
另外值得一提的是:当我翻转Base
(Joined
)的继承时,我得到了
DerTwo
作为输出。
只在struct Joined : DerTwo, DerOne
构造函数中执行doSomething()
会给出错误的函数调用错误。
当我使用虚拟继承时,我再次出现歧义错误。
如果不能以这种方式同时调用这两个函数,那么我只有一行代码不能解决层次结构中的中间类,或者只有一行代码可以实现这一功能。甚至没有隐含的代码行?
答案 0 :(得分:1)
快速修复只是明确地使用Joined调用。 (编辑以覆盖虚函数)
virtual void Joined::thatSomething() override
{
DerOne::thatSomething();
DerTwo::thatSomething();
}
如果那不能解决问题,那么继承可能并不合适。在所有OOP之前,组合使用得更多,而且它仍然很强大。
如果您在调用那个东西()时期望发生特定事情,但是您不知道要调用哪一个,那么可能它根本不是真的,Joined是-a DerOne和Der-DerTwo。但是对于Joined来说,拥有一个DerOne,拥有一个DerTwo以及你想要的更多东西要容易得多。
#include <list>
#include <memory>
struct DerHandler
{
std::list<std::unique_ptr<DerBase>> handlers;
void addHandler(DerBase *p) {
handlers.push_back(std::unique_ptr<DerBase>(p));
}
void doSomething() {
for (std::unique_ptr<DerBase> &rp : handlers)
rp->thatSomething();
}
};
struct Joined : DerHandler {
Joined(){
addHandler(new DerOne);
addHandler(new DerTwo);
}
};