如何调用父母的同名虚函数

时间:2017-03-22 20:53:44

标签: c++ multiple-inheritance

#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实例。

另外值得一提的是:当我翻转BaseJoined)的继承时,我得到了

  

DerTwo

作为输出。

只在struct Joined : DerTwo, DerOne构造函数中执行doSomething() 会给出错误的函数调用错误。

当我使用虚拟继承时,我再次出现歧义错误。

如果不能以这种方式同时调用这两个函数,那么我只有一行代码不能解决层次结构中的中间类,或者只有一行代码可以实现这一功能。甚至没有隐含的代码行?

1 个答案:

答案 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);
    }
};