C++/inheritance and virtual functions

From Attie's Wiki
Revision as of 15:41, 8 June 2012 by Attie (Talk | contribs)

Jump to: navigation, search

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";
}
 
/* --- */
 
class c2_i {
	public:
		explicit c2_i(void);
		~c2_i(void);
 
		virtual void c2_callback(void) = 0;
};
 
c2_i::c2_i(void) {
	cout << "c2_i::c2_i\n";
}
c2_i::~c2_i(void) {
	cout << "c2_i::~c2_i\n";
}
 
/* --- */
 
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
c2_i::c2_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
c2_i::~c2_i
c1_i::~c1_i
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox