C++的继承(八):模板和虚函数

我们知道包含基类的成员和继承的作用是相同的,如果没有用到虚函数和受保护的成员的话。

现在,一个对话框包含两个button,既然能够用成员变量来实现,那么用继承来实现当然是没问题。

class SystemButton {
    
    };
class Button1 : public SystemButton {
    
    
public:
	virtual OnButtonClick1()  {
    
    
	    printf("button 1 click\n");
    }
};
class Button2 : public SystemButton {
    
    
public:
	virtual OnButtonClick2(){
    
    
	    printf("button 2 click\n");
    }
};

class diag: public button1, public button2 {
    
    
public:
        virtual void OnButtonClick() {
    
    
                printf("overload button i=1 click\n");
                handle1();
        }
        virtual void OnButtonClick() {
    
    
                printf("overload button i=2 click\n");
                handle2();
        }

        void handle1() {
    
    printf(__FUNCTION__);printf("\n");}
        void handle2() {
    
    printf(__FUNCTION__);printf("\n");}
};

对于这个实现来说,button1和button2的机制是完全相同的,因此想到了使用模板,这样用确实是可以的:

#include <stdio.h>

class SystemButton{
    
    };

template<int i> struct ClickedId{
    
    };

template <int i> class button: public SystemButton {
    
    
public:
        virtual void OnButtonClick(ClickedId<i>) {
    
    
                printf("button %d click\n", i);
        }
};

class mydiag: public button<1>, public button<2>
{
    
    
public:
        template <int i> void OnButtonClick(ClickedId<i>) {
    
    
                printf("button i=%d click\n", i);
                printf("no linked function\n");
        }

        virtual void OnButtonClick(ClickedId<1>) {
    
    
                printf("overload button i=1 click\n");
                handle1();
        }
        virtual void OnButtonClick(ClickedId<2>) {
    
    
                printf("overload button i=2 click\n");
                handle2();
        }

        void handle1() {
    
    printf(__FUNCTION__);printf("\n");}
        void handle2() {
    
    printf(__FUNCTION__);printf("\n");}
};


int main()
{
    
    
        mydiag  d;

        button<0> *pb;
        d.OnButtonClick(ClickedId<1>());
        pb = (button<0>*) static_cast<button<2>*>(&d);
        button<2> *b2 = (button<2>*) pb;
        b2->OnButtonClick(ClickedId<2>());
        return 0;
}

这里用到了一个没有内容的模板类ClickedId。这是因为C++编译器不同意用
template <> void OnButtonClick()
这样的语法来特化成员函数模板。所以额外增加了一个模板类ClickedId,作为OnButtonClick()的参数,这样写和OnButtonClick()等价。这当然是做做样子的。

猜你喜欢

转载自blog.csdn.net/aaasssdddd96/article/details/120663602
今日推荐