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

在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)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值