我们知道包含基类的成员和继承的作用是相同的,如果没有用到虚函数和受保护的成员的话。
现在,一个对话框包含两个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()等价。这当然是做做样子的。