TITLE: Pure virtuals, multiple inheritance, and dominance PROBLEM: kmr@netcom.com (KMR) I could not find an answer to my problem of abstract base class and pure virtual functions in ARM, any help will be appreciated. Consider the following: class A { public: virtual void foo1() = 0; }; class C : virtual public A {}; class B : virtual public A { public : virtual void foo1() {cout<<"I'm B::foo1\n";} }; class D : public B, public C {}; When compiling the above on SUN 2.1 Cfront, the compiler fails informing me that D is an abstract class and thus cannot be "newed" RESPONSE: carney@rocky.rational (Mike Carney) I think that your real problem here is that class C does not have an implementation of foo1(). If a class is an abstract class (i.e. any of its virtual members is declared line foo1() and foo2() in class A above), then all of its derived classes *must* have implementations of those virtual member functions that were declared abstract. RESPONSE: maxtal@extro.ucc.su.OZ.AU (John MAX Skaller), 1 Oct 92 No, only the most derived class D must have implementations. The function B::foo1() dominates A::foo1(), therefore all virtual calls d->foo1(); c->foo1(); b->foo1(); a->foo1(); bind to B::foo1(). Give A::foo1() a dummy body instead of the pure specifier to test this out. See: A::foo1() cannot be virtually called. It follows D is concrete. It has no holes. Whether A::foo1 is pure or not should make no difference (since it cannot be called). There is a section in the ARM dealing with the sibling call mechanism. It is the basis of c++ "mixin" style. Its operation depends on the name dominance rule (also discussed), which is claimed to be the basis of polymorphism in C++. It is unfortunate the ARM example did not use pure virtuals in the base class in the example.