Ich erweitere ein bestehendes C++-Projekt. Ich habe eine Basisklasse, die von zwei Elternklassen abgeleitet ist. Eine der Elternklassen hat eine rein virtuelle Funktion. Ich möchte, dass diese rein virtuelle Funktion durch eine in der anderen übergeordneten Klasse implementierte Funktion definiert wird.
Ich möchte also, dass ein anderes Elternteil die Verpflichtung der Basisklasse erfüllt, eine rein virtuelle Funktion des Elternteils zu definieren. Ich habe zwei Ansätze ausprobiert, die beide zu Compilerfehlern geführt haben.
Irgendwelche Ideen?
Hier ist ein C++-Programm, das meine erste Idee demonstriert, in der Hoffnung, der Compiler würde einfach die base2
Definition von vfunc()
.
// This is my first approach, hoping the parent base2 of derived would satisfy the need to define
// base1's pure virtual vfunc.
class base1 {
public:
virtual int vfunc() = 0;
};
class base2 {
public:
int vfunc() { return 0;} //defined
};
class derived : public base1, public base2 {
public:
//empty
};
int main()
{
derived d;
base1 & b1 = d;
int result = b1.vfunc();
return result;
}
Der Compiler meldet, dass derived
ist immer noch eine abstrakte Klasse:
$ gcc a.cc
a.cc: In function ‘int main()’:
a.cc:26: error: cannot declare variable ‘d’ to be of abstract type ‘derived’
a.cc:18: note: because the following virtual functions are pure within ‘derived’:
a.cc:7: note: virtual int base1::vfunc()
Hier ist mein zweiter Versuch:
// This is my second attempt, defining a vfunc in the derived class that calls the other parent.
class base1 {
public:
virtual int vfunc() = 0;
};
class base2 {
public:
int vfunc() { return 0; } // defined
};
class derived : public base1, public base2 {
public:
int vfunc() { return base2::vfunc(); } // call the other parent's vfunc
};
int main()
{
derived d;
base1 & b1 = d;
int result = b1.vfunc();
return result;
}
Ich eigentlich erwartet, dass dies für mich zu tun, aber stattdessen der Linker gibt mir eine Reihe von vtable Fehler, die ich nicht verstehe: ( Mac OS 10.6, gcc 4.2.1 )
$ gcc inheritance_tester.cc
Undefined symbols:
"vtable for __cxxabiv1::__vmi_class_type_info", referenced from:
typeinfo for derivedin ccmeHq8C.o
"___cxa_pure_virtual", referenced from:
vtable for base1in ccmeHq8C.o
"___gxx_personality_v0", referenced from:
_main in ccmeHq8C.o
base2::vfunc() in ccmeHq8C.o
derived::vfunc() in ccmeHq8C.o
base1::base1() in ccmeHq8C.o
base2::base2() in ccmeHq8C.o
derived::derived()in ccmeHq8C.o
CIE in ccmeHq8C.o
"vtable for __cxxabiv1::__class_type_info", referenced from:
typeinfo for base1in ccmeHq8C.o
typeinfo for base2in ccmeHq8C.o
ld: symbol(s) not found