C++/inheritance and virtual functions

From Attie's Wiki
(Difference between revisions)
Jump to: navigation, search
m
m
Line 3: Line 3:
 
<source lang="cpp">
 
<source lang="cpp">
 
#include <iostream>
 
#include <iostream>
 +
#include <string>
 
using namespace std;
 
using namespace std;
 
+
 
/* --- */
 
/* --- */
 
+
 
class c1_i {
 
class c1_i {
 
public:
 
public:
 
explicit c1_i(void);
 
explicit c1_i(void);
 
~c1_i(void);
 
~c1_i(void);
+
 
virtual void c1_callback(void) = 0;
 
virtual void c1_callback(void) = 0;
 
};
 
};
 
+
 
c1_i::c1_i(void) {
 
c1_i::c1_i(void) {
 
cout << "c1_i::c1_i\n";
 
cout << "c1_i::c1_i\n";
Line 21: Line 22:
 
cout << "c1_i::~c1_i\n";
 
cout << "c1_i::~c1_i\n";
 
}
 
}
 
+
 
/* --- */
 
/* --- */
 
+
 
/* c2_i has no constructor / destructor functions */
 
/* c2_i has no constructor / destructor functions */
 
class c2_i {
 
class c2_i {
Line 29: Line 30:
 
virtual void c2_callback(void) = 0;
 
virtual void c2_callback(void) = 0;
 
};
 
};
 +
 +
/* --- */
 +
 +
/* c3_i has a constructor that takes an argument */
 +
class c3_i {
 +
public:
 +
explicit c3_i(string message);
 +
 +
string message;
 +
 +
virtual void c3_callback(void) = 0;
 +
};
 +
 +
c3_i::c3_i(string message) {
 +
this->message = message;
 +
}
  
 
/* --- */
 
/* --- */
 
+
class myC: public c1_i, public c2_i {
+
class myC: public c1_i, public c2_i, public c3_i {
 
public:
 
public:
explicit myC(void);
+
explicit myC(string message);
 
~myC(void);
 
~myC(void);
+
 
void c1_callback(void);
 
void c1_callback(void);
 
void c2_callback(void);
 
void c2_callback(void);
 +
void c3_callback(void);
 
};
 
};
 
+
myC::myC(void) {
+
myC::myC(string message): c3_i(message) {
 
cout << "myC::myC\n";
 
cout << "myC::myC\n";
 
}
 
}
Line 53: Line 71:
 
cout << "myC::c2_callback\n";
 
cout << "myC::c2_callback\n";
 
}
 
}
 
+
void myC::c3_callback(void) {
 +
cout << "myC::c3_callback: " << message << "\n";
 +
}
 +
 
/* --- */
 
/* --- */
 
+
 
class t1 {
 
class t1 {
 
public:
 
public:
 
explicit t1(c1_i *i);
 
explicit t1(c1_i *i);
 
~t1(void);
 
~t1(void);
+
 
void exec(void);
 
void exec(void);
+
 
private:
 
private:
 
c1_i *i;
 
c1_i *i;
Line 78: Line 99:
 
i->c1_callback();
 
i->c1_callback();
 
}
 
}
 
+
 
/* --- */
 
/* --- */
 
+
 
class t2 {
 
class t2 {
 
public:
 
public:
 
explicit t2(c2_i *i);
 
explicit t2(c2_i *i);
 
~t2(void);
 
~t2(void);
+
 
void exec(void);
 
void exec(void);
+
 
private:
 
private:
 
c2_i *i;
 
c2_i *i;
Line 103: Line 124:
 
i->c2_callback();
 
i->c2_callback();
 
}
 
}
 
+
 
/* --- */
 
/* --- */
 
+
 
int main(int argc, char *argv[]) {
 
int main(int argc, char *argv[]) {
myC m;
+
myC m("howdy");
+
 
m.c1_callback();
 
m.c1_callback();
 
m.c2_callback();
 
m.c2_callback();
+
m.c3_callback();
 +
 
t1 t(&m);
 
t1 t(&m);
 
t.exec();
 
t.exec();
+
 
t2 tt(&m);
 
t2 tt(&m);
 
tt.exec();
 
tt.exec();
+
 
cout << "hi\n";
 
cout << "hi\n";
 
return 0;
 
return 0;

Revision as of 19:40, 9 June 2012

A good how-to for implementing callbacks in C++

#include <iostream>
#include <string>
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;
};
 
/* --- */
 
 /* c3_i has a constructor that takes an argument */
class c3_i {
	public:
		explicit c3_i(string message);
 
		string message;
 
		virtual void c3_callback(void) = 0;
};
 
c3_i::c3_i(string message) {
	this->message = message;
}
 
/* --- */
 
class myC: public c1_i, public c2_i, public c3_i {
	public:
		explicit myC(string message);
		~myC(void);
 
		void c1_callback(void);
		void c2_callback(void);
		void c3_callback(void);
};
 
myC::myC(string message): c3_i(message) {
	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";
}
void myC::c3_callback(void) {
	cout << "myC::c3_callback: " << message << "\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("howdy");
 
	m.c1_callback();
	m.c2_callback();
	m.c3_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
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox