Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:如何在具有基类的父接口中实现函数?_C++_Oop_Inheritance_Interface - Fatal编程技术网

C++ C++;:如何在具有基类的父接口中实现函数?

C++ C++;:如何在具有基类的父接口中实现函数?,c++,oop,inheritance,interface,C++,Oop,Inheritance,Interface,考虑以下层次结构: class Interface { public: virtual void foo() = 0; }; class SubInterface: public Interface { public: virtual void bar() = 0; }; class Base: public Interface { public: void foo() {}; }; class Impl: public SubInterface, public B

考虑以下层次结构:

class Interface {
public:
    virtual void foo() = 0;
};

class SubInterface: public Interface {
public:
    virtual void bar() = 0;
};

class Base: public Interface {
public:
    void foo() {};
};

class Impl: public SubInterface, public Base {
public:
    void bar() {};
};
  • 除了foo()之外,还有几个提供其他方法的子接口
  • 子接口可以有几个实现类
  • foo()的实现方式始终相同
下面是一个模拟如何使用这些类的示例:

int main() {
    SubInterface* view1 = new Impl(); // Error! Interface::foo() is pure virtual within Impl
    view1->foo();
    view1->bar();
    Interface* view2 = view1;
    view2->foo();
}
为什么编译器看不到
Interface::foo()
是在
Base
中实现的,而
Impl
继承自该库

我想我可以在
Impl
中显式地实现
foo()
,并将调用委托给
Base
,如下所示:

class Impl: public SubInterface, public Base {
public:
    void foo() {
        Base::foo();
    }
    void bar() {};
};

但是,对于实现子接口的所有类,我都必须这样做,所以这种方式并不理想。有更好的解决方案吗?

子接口
应该实际上继承自
接口
,否则会以
基本上,Impl包含两个接口的“实例”。

以下是原因-按照图:


哦,我真希望这是可能的。@Travis:你什么意思?当然有可能…@eladian:如果他能将虚拟继承添加到
子接口
,这是有可能的……我想这个问题还不清楚:-)啊。当我试图解决这个问题时,我读过关于虚拟继承的书,但是我把
Impl
inherit
Interface
虚拟化了,结果搞砸了。谢谢我喜欢的IDE仍然认为
Impl
是抽象的,但它在gcc中工作。实际上,是虚拟继承创建了菱形。如果没有虚拟继承,你会得到一棵树。你能把它转换成ASCII码吗?我的眼睛不允许我。