在QT中,对于所有定义了信号和槽的类,定义的开始处需要加入:Q_OBJECT宏!!!
/* tmake ignore Q_OBJECT */
#define Q_OBJECT \
public: \
Q_OBJECT_CHECK \
static const QMetaObject staticMetaObject; \
Q_OBJECT_GETSTATICMETAOBJECT \
virtual const QMetaObject *metaObject() const; \
virtual void *qt_metacast(const char *); \
QT_TR_FUNCTIONS \
virtual int qt_metacall(QMetaObject::Call, int, void **); \
private: \
Q_DECL_HIDDEN static const QMetaObjectExtraData staticMetaObjectExtraData; \
Q_DECL_HIDDEN static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
由于众所周知的,继承将导致内存及性能消耗,这种方式是个不错的选择.下面,我们灵活的运用这个方案.
/*
* File: main.cpp
* Author: Vicky.H
* Email: eclipser@163.com
*/
#include <iostream>
#include <typeinfo>
#include <string.h>
class A {
public:
virtual ~A() {};
virtual void sayHello() = 0;
};
class A1 : public A {
public:
void sayHello() {
std::cout << "hello A1" << std::endl;
}
~A1() {
std::cout << "delete A1" << std::endl;
}
};
class A2 : public A {
public:
void sayHello() {
std::cout << "hello A2" << std::endl;
}
~A2() {
std::cout << "delete A2" << std::endl;
}
};
#define B_OBJECT \
public: \
void sayHello() { \
std::cout << "hello " << this->name << "\t" \
<< typeid(this).name() << std::endl; \
} \
private: \
char name[21];
template<typename T>
void sayHello (T& o) {
o.sayHello();
}
template<typename T>
void sayHello (T* o) {
o->sayHello();
}
template<typename T>
void sayHello (const T* o) {
o->sayHello();
}
class B1 {
B_OBJECT
public:
B1(const char* name) {
strcpy(this->name,name);
}
};
class B2 {
B_OBJECT
public:
B2(const char* name) {
strcpy(this->name,name);
}
};
/*
*
*/
int main(void) {
A* a1 = new A1;
a1->sayHello();
delete a1;
A* a2 = new A2;
a2->sayHello();
delete a2;
std::cout << "---------------------------" << std::endl;
B1 *b1 = new B1("Vicky");
b1->sayHello();
sayHello(b1);
delete b1;
B2 *b2 = new B2("Jack");
b2->sayHello();
sayHello(b2);
delete b2;
return 0;
}
hello A1
delete A1
hello A2
delete A2
---------------------------
hello Vicky P2B1
hello Vicky P2B1
hello Jack P2B2
hello Jack P2B2
运行 SUCCESSFUL (总时间: 63ms)