C++/inheritance and virtual functions
From Attie's Wiki
(Difference between revisions)
m |
m |
||
Line 24: | Line 24: | ||
/* --- */ | /* --- */ | ||
+ | /* c2_i has no constructor / destructor functions */ | ||
class c2_i { | class c2_i { | ||
public: | public: | ||
− | |||
− | |||
− | |||
virtual void c2_callback(void) = 0; | virtual void c2_callback(void) = 0; | ||
}; | }; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
/* --- */ | /* --- */ | ||
Line 136: | Line 127: | ||
$ g++ test.cpp -o test && ./test | $ g++ test.cpp -o test && ./test | ||
c1_i::c1_i | c1_i::c1_i | ||
− | |||
myC::myC | myC::myC | ||
myC::c1_callback | myC::c1_callback | ||
Line 150: | Line 140: | ||
t1::~t1 | t1::~t1 | ||
myC::~myC | myC::~myC | ||
− | |||
c1_i::~c1_i | c1_i::~c1_i | ||
</source> | </source> |
Revision as of 15:44, 8 June 2012
A good how-to for implementing callbacks in C++
#include <iostream> using namespace std; /* --- */ class c1_i { public: explicit c1_i(void); ~c1_i(void); virtual void c1_callback(void) = 0; }; c1_i::c1_i(void) { cout << "c1_i::c1_i\n"; } c1_i::~c1_i(void) { cout << "c1_i::~c1_i\n"; } /* --- */ /* c2_i has no constructor / destructor functions */ class c2_i { public: virtual void c2_callback(void) = 0; }; /* --- */ class myC: public c1_i, public c2_i { public: explicit myC(void); ~myC(void); void c1_callback(void); void c2_callback(void); }; myC::myC(void) { cout << "myC::myC\n"; } myC::~myC(void) { cout << "myC::~myC\n"; } void myC::c1_callback(void) { cout << "myC::c1_callback\n"; } void myC::c2_callback(void) { cout << "myC::c2_callback\n"; } /* --- */ class t1 { public: explicit t1(c1_i *i); ~t1(void); void exec(void); private: c1_i *i; }; t1::t1(c1_i *i) { if (i == NULL) throw(-1); this->i = i; cout << "t1::~t1\n"; } t1::~t1(void) { cout << "t1::~t1\n"; } void t1::exec(void) { cout << "t1::exec\n"; i->c1_callback(); } /* --- */ class t2 { public: explicit t2(c2_i *i); ~t2(void); void exec(void); private: c2_i *i; }; t2::t2(c2_i *i) { if (i == NULL) throw(-1); this->i = i; cout << "t2::~t2\n"; } t2::~t2(void) { cout << "t2::~t2\n"; } void t2::exec(void) { cout << "t2::exec\n"; i->c2_callback(); } /* --- */ int main(int argc, char *argv[]) { myC m; m.c1_callback(); m.c2_callback(); t1 t(&m); t.exec(); t2 tt(&m); tt.exec(); cout << "hi\n"; return 0; }
Expected output
$ g++ test.cpp -o test && ./test c1_i::c1_i myC::myC myC::c1_callback myC::c2_callback t1::~t1 t1::exec myC::c1_callback t2::~t2 t2::exec myC::c2_callback hi t2::~t2 t1::~t1 myC::~myC c1_i::~c1_i