宏,函数模版方式实现继承方案

来源:互联网 发布:手机安装完整版linux 编辑:程序博客网 时间:2024/06/07 03:10

在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_OBJECTpublic:    B1(const char* name) {        strcpy(this->name,name);    }};class B2 {    B_OBJECTpublic:    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)


 

原创粉丝点击