我有一个抽象类作为接口,从这个是另一个派生为抽象类的接口。 从这里我得到了一个基类和一个最终的类。我不明白的是为什么我得到编译器错误,无法访问基类中的函数。我曾经问过一个类似的问题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()
而没有任何错误。