Ik wilde een stuk code schrijven wat de volgende structuur heeft:
Een basis klasse met een public method:
Een afgeleide klasse daarvan met een method met dezelfde naam maar een andere argumenten lijst en dus een andere signature.
En vervolgens een stukje code om dat mee te testen...
Ik ging er van uit dat dit zou werken en dat het mogelijk was om methodes uit de basis klasse te overloaden zonder dat dit de methode van de basis klasse onzichtbaar maakt. Maar dit blijkt dus niet zo te zijn. De regel
geeft als foutmelding dat parameter 1 niet van int naar std::string geconverteerd kan worden. Met andere woorden hij roept dus CSomeClass::Test() aan terwijl CBase::Test() de methode is die ik bedoelde aan te roepen. Als je beide Test() methoden in dezelfde class neerzet werkt het overloaden prima dus ik ging er van uit dat dit concept ook van toepassing is van klasse op klasse.
Een simpele oplossing hiervoor is natuurlijk om gewoon een andere naam te gebruiken in de afgeleide klasse maar ik zou toch graag een alternatieve implementatie voor een bestaande methode in de basis class willen specificeren (met andere argumenten lijst dus) zonder deze compleet te overriden.
Is dit inderdaad onmogelijk en zo ja, weet iemand ook waarom? (ja, ik vindt dat soort dingen interessant)
Een basis klasse met een public method:
C++:
1
2
3
4
5
6
7
8
| class CBase { public: void Test(int number) { cout << "Base test\n"; } }; |
Een afgeleide klasse daarvan met een method met dezelfde naam maar een andere argumenten lijst en dus een andere signature.
C++:
1
2
3
4
5
6
7
8
9
| class CSomeClass : public CBase { public: void Test(string &text) { cout << "Some Class test\n"; } }; |
En vervolgens een stukje code om dat mee te testen...
C++:
1
2
3
4
5
6
7
8
9
10
| int _tmain(int argc, _TCHAR* argv[]) { CSomeClass obj; string text = "hoi"; obj.Test(1); obj.Test(text); return 0; } |
Ik ging er van uit dat dit zou werken en dat het mogelijk was om methodes uit de basis klasse te overloaden zonder dat dit de methode van de basis klasse onzichtbaar maakt. Maar dit blijkt dus niet zo te zijn. De regel
C++:
1
| obj.Test(1); |
geeft als foutmelding dat parameter 1 niet van int naar std::string geconverteerd kan worden. Met andere woorden hij roept dus CSomeClass::Test() aan terwijl CBase::Test() de methode is die ik bedoelde aan te roepen. Als je beide Test() methoden in dezelfde class neerzet werkt het overloaden prima dus ik ging er van uit dat dit concept ook van toepassing is van klasse op klasse.
Een simpele oplossing hiervoor is natuurlijk om gewoon een andere naam te gebruiken in de afgeleide klasse maar ik zou toch graag een alternatieve implementatie voor een bestaande methode in de basis class willen specificeren (met andere argumenten lijst dus) zonder deze compleet te overriden.
Is dit inderdaad onmogelijk en zo ja, weet iemand ook waarom? (ja, ik vindt dat soort dingen interessant)