请考虑下面的代码: struct A { void f() { } }; struct B1 : A { }; struct B2 : A { }; struct C : B1, B2 { void f() // works { B1::f(); } //using B1::f; // does not work //using B1::A::f; // does not work as well }; int main() { C c; cf(); […]
在Java中,抽象类和接口之间是微妙而重要的区别: 默认实现 。 抽象类可以有他们,接口不能。 虽然Java 8引入了接口的默认实现,这意味着这不再是接口和抽象类之间的关键区别。 那么是什么? 尽我所知,唯一剩下的差别(除了可能是一些效率下面的东西),抽象类遵循传统的Java单一inheritance,而接口可以有多重inheritance(或多重实现,如果你愿意的话)。 这导致我另一个问题 – 新的Java 8接口如何避免钻石问题 ?
class A { public: void eat(){ cout<<"A";} }; class B: virtual public A { public: void eat(){ cout<<"B";} }; class C: virtual public A { public: void eat(){ cout<<"C";} }; class D: public B,C { public: void eat(){ cout<<"D";} }; int main(){ A *a = new D(); a->eat(); } 我了解钻石问题,上面的代码没有这个问题。 虚拟inheritance如何解决问题? 我的理解是:当我说A *a = new […]
为了充分理解如何解决Java的多重inheritance问题,我有一个经典的问题,我需要澄清。 可以说我有class级Animal这有分类Bird和Horse ,我需要做一个class级Pegasus从Bird和Horse延伸,因为Pegasus是一个鸟和一匹马。 我认为这是经典的钻石问题。 从我所能理解的经典方式来解决这个问题,就是让Animal , Bird和Horse类从他们的界面实现Pegasus 。 我想知道是否有另一种方法来解决我仍然可以为鸟和马创造对象的问题。 如果有一种方法能够创造动物,那也是很好的,但不是必要的。