虚拟公共派生基函数不可见

时间:2014-07-17 13:20:13

标签: c++ inheritance interface virtual

我有一个抽象类作为接口,从这个是另一个派生为抽象类的接口。 从这里我得到了一个基类和一个最终的类。我不明白的是为什么我得到编译器错误,无法访问基类中的函数。我曾经问过一个类似的问题agao,但那时它只是关于派生自己。因此,我将接口类派生为虚拟,但它并没有真正帮助。

我创建了一个简单的示例来说明我的问题。

#include <iostream>
#include <string>

class IContainer
{
public:
    IContainer() {};
    virtual ~IContainer() {};

    virtual void loadDefaults() = 0;
    virtual void storeDefaults() = 0;

    virtual bool open() = 0;
    virtual bool close() = 0;
};

class IContainerWriter :  virtual public IContainer
{
public:
    IContainerWriter() {};
    virtual ~IContainerWriter() {};

    virtual bool open(char *s) = 0;
    virtual bool write() = 0;
};

class ContainerBase : public virtual IContainer
{
public:
    ContainerBase() {}
    virtual ~ContainerBase() {}

    void loadDefaults() override {}
    void storeDefaults() override {}
};

class WriterBase : public virtual ContainerBase
{
public:
    WriterBase() {}
    virtual ~WriterBase() {}

    void setFilename() {}
    bool open() override { return true; }
    bool close() override { return true; }
};

class Writer : public virtual WriterBase, public virtual IContainerWriter
{
public:
    Writer() {}
    virtual ~Writer() {}

    bool open(char *s) override
    {
        if(open() == false)
            return false;

        if(s)
            str = s;
        else
            return false;

        return true;
    }
    bool write() override { return true; }

private:
    char *str;
};

int main(int argc, char *argv[])
{
    Writer w;
    IContainerWriter *iw = &w;

    iw->open();
    iw->write();
    iw->close();

    return 0;
}

Erorr:

error: no matching function for call to 'Writer::open()'|

当然我可以在调用中添加WriterBase::open(),然后一个错误消失,但我仍然无法使用接口指针调用open()函数,因为我被送到。

我真正不理解的是,当我删除bool open(char *s)的声明时,我可以突然调用基类open()而没有任何错误。

0 个答案:

没有答案