abstrakte Klassen
-
Warum geht das nicht?
"B" ist doch jetzt nicht mehr abstrakt oder, sondern nur "A" und "temp".#include <iostream> using namespace std; class temp { virtual void speak() = 0; virtual void reproduce() = 0; virtual void laugh() = 0; }; class A : public temp { public: void reproduce(); }; class B : public A { public: void speak(); void laugh(); }; int main() { B obj; return 0; }FEHLERMELDUNG:
Compiling: C:\MinGW\Andi\test.cpp
Linking console executable: C:\MinGW\Andi\test.exe
C:\MinGW\Andi\test.o:test.cpp:(.text_ZN1BC1Ev[B::B()]+0x16): undefined reference to `vtable for B' C:\\MinGW\\Andi\\test.o:test.cpp:(.text_ZN1AC2Ev[A::A()]+0x16): undefined reference to `vtable for A'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warningsChecking for existence: C:\MinGW\Andi\test.exe
MfG
Stromberg
-
Stromberg schrieb:
Warum geht das nicht?
Es geht doch. Nur beschwert sich der Linker, dass deine überschreibenden Funktionen nicht definiert wurden. Virtuelle Funktionen, die nicht rein-virtuell sind, müssen auch dann definiert werden, wenn sie nicht benutzt werden.
-
// #include <iostream> nicht genutzt // using namespace std; // NIE im Header class base { public: base() {} virtual ~base() {} public: virtual void speak() {}; virtual void reproduce() {}; virtual void laugh() {}; }; class foo : public base { public: void reproduce(); }; class bar : public base { public: void speak(); void laugh(); };und der hält die Klappe

#include <vector> int main() { std::vector<base*> data; B _obj; data.push_back(&_obj); }
-
(D)Evil schrieb:
und der hält die Klappe

Da gibt's rein gar nichts zu ";)", denn das ist genau das Problem deiner Variante.