merkwürdiger Compilerfehler bei verwendung von abstrakten klassen...
-
kurz und bündig: WTH?
#include <iostream> class IInterface { public: virtual void foo() = 0; }; class ISubInterface : public IInterface { public: virtual void foo( int arg ) = 0; }; class Class : public ISubInterface { public: virtual void foo() { std::cout << "foo()" << std::endl; } virtual void foo( int arg ) { std::cout << "foo(int arg)" << std::endl; } }; int main( int argc, char **argv ) { ISubInterface *i = new Class(); i->foo(); // compilerfehler i->foo( 0 ); delete i; return 0; }msvc 9.0 schrieb:
error C2660: 'ISubInterface::foo' : function does not take 0 arguments
meine welt wurde gerade in ihren grundfesten erschüttert. sollte das so sein?
-
Wie soll denn eine Funktion aufgerufen werden, die in der Klasse nicht deklariert ist?
-
@Nexus,
Er will dasvoid foo()vonIInterfaceaufrufen
@iko79,
Fiese Sache.
Das voidfoo( int arg )ausISubInterfaceüberdeckt dasvoid foo()vonIInterface. Überladung geht nur im gleichen Scope. Eine Basisklasse hat einen anderen Scope.
ÄndereISubInterfacewie folgt ab:class ISubInterface : public IInterface { public: using IInterface::foo; virtual void foo( int arg ) = 0; };So holst du das
void foo()aus der Elternklasse in die Kindklasse. Die Überladung sollte nun funktionieren.Grüssli
-
Dravere schrieb:
@Nexus,
Er will dasvoid foo()vonIInterfaceaufrufen
Argh! Zuerst dachte ich auch, das wäre ein Überdeckungsproblem, ich habe sogar schon den Post dazu geschrieben. Irgendwie hab ich beim erneuten Lesen das Problem an anderer Stelle gesehen und meinen Beitrag nochmals neu geschrieben...

-
ohmann. c++ ist echt immer wieder für eine überraschung gut. danke!!