/* metptr.cpp Esimerkki metodi-osoittimista ja kontravarianssista. Erilaisia tapoja kutsua olion metodia. Vesa Lappalainen 22.1.2000 */ class cTesti1 { protected: int i; public: cTesti1() { i = 0; } virtual void hommaa() {} virtual void aseta(); }; class cTesti2 : public cTesti1 { public: virtual void aseta(); }; void cTesti1::aseta() { i = 1; } void cTesti2::aseta() { i = 2; } typedef void (cTesti1::*Pm1)(); typedef void (cTesti2::*Pm2)(); //--------------------------------------------------------------------------- #pragma argsused cTesti1 t1; cTesti2 t2; Pm1 mp1; Pm2 mp2; cTesti1 *op1 = &t1; cTesti1 *op1a = &t2; cTesti2 *op2 = &t2; int i; int main(int argc, char* argv[]) { mp2 = &cTesti1::hommaa; mp1 = &cTesti1::aseta; mp1 = &cTesti1::aseta; i = sizeof(mp1); (op1->*mp1)(); (op2->*mp2)(); (op2->*mp1)(); (t1.*mp1)(); t1.aseta(); op1->aseta(); t2.aseta(); op2->aseta(); mp2 = mp1; // mp1 = mp2; // ei toimi Kontravarianssi op1 = op2; // op2 = op1; // ei toimi op1->aseta(); return 0; }