Spätes Binden funktioniert nicht? (virtual)

m0zkit0

Grünschnabel
Hallo,

ich habe mir mal die Funktionalität von spätem Binden angeschaut und weiss leider einfach nicht, was ich bei meinem kleinen Nachmachversuch falsh mache.

Mein Frage: Warum wird mir beim Ausführen immer der Text: "std::exception" angezeigt und nicht, wie gewollt "Hello". Ich dachte durch das Schlüsselwort "virtual" vor der "what"-Methode würde ich für diese das späte Binden aktivieren und es würde der Programmcode in "myException::what() throw()" ausgeführt. Stattdessen habe ich aber das Gefühl, es würde der Code von "exception::what() throw()" ausgegeben.
Dies geschieht auch, wenn die die Definition und Deklaration von "Test() throw(exception)" auf "Test() throw(myException)" ändere, aber ich denke der Fehler bzw. die Ursache liegt eher woanders.

Vielen Dank für die Hilfe.

MFG

mozi

Klasse mit MAIN-Methode:
C++:
#include "Test.h"
#include <exception>
#include "myException.h"
#include <iostream>

using namespace std;

Test::Test() throw(exception) {
	string e_str = "hello";
	throw myException(e_str);
}
Test::~Test() {
}
int main(int argc, char **argv) {

	try {
		Test* t = new Test();
	}
	catch (exception& e) {
		printf("%s", e.what());
	}
}
Header dieser Klasse:
C++:
#ifndef TEST_H_
#define TEST_H_

#include <exception>
#include "myException.h"

using namespace std;

class Test
{
public:
	Test() throw (exception);
	virtual ~Test();
};
#endif /*TEST_H_*/
Klasse "myException"
C++:
#include "myException.h"

myException::myException(std::string& message)
{
	this->message = message;
}
const char* myException::what() throw()
{
	return message.c_str();
}
myException::~myException() throw()
{
}
Header von "myException"
C++:
#ifndef EXCEPTION_H_
#define EXCEPTION_H_

#include <exception>
#include <string>

using namespace std;

class myException : public std::exception {
public:
	myException(string& msg);
	virtual const char* what() throw();
	virtual ~myException() throw();
private:
	string message;
};
#endif /*EXCEPTION_H_*/
 
Zuletzt bearbeitet von einem Moderator:
Hallo,
also: wenn du in deiner abgeleiteten Klasse einen function member virtuell setzt, so bringt das erst dann was, wenn jemand von deiner Klasse ableitet und dort what() definiert.
Desweiteren schau dir mal die Deklaration von what() in der std::exception an:
Code:
virtual const char* std::exception::what  (    )  const throw () ;
Bei myException fehlt das const hinten, damit ist es dann nicht der virtuellen Funktion zugehörig.
Vorschlag: virtual in myException weglassen, const bei what() hinzufügen.
 
Zurück