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()等价。这当然是做做样子的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
封装、继承和多态是面向对象编程中的三大特性,C++也支持这三种特性。 1. 封装 封装是指将数据和对数据的操作封装在一起,形成一个类。类中的数据和方法可以设置为私有的,只有类内部可以访问,外部无法访问。这样可以保证数据的安全性和完整性。 下面是一个封装的例子: ```c++ class Person { private: string name; int age; public: void setName(string n) { name = n; } void setAge(int a) { age = a; } string getName() { return name; } int getAge() { return age; } }; ``` 2. 继承 继承是指一个类可以继承另一个类的属性和方法。被继承的类称为父类或基类,继承的类称为子类或派生类。子类可以使用父类的属性和方法,也可以重写父类的方法。 下面是一个继承的例子: ```c++ class Student : public Person { private: int id; public: void setId(int i) { id = i; } int getId() { return id; } }; ``` 3. 多态 多态是指同一种类型的对象,在不同的情况下可以有不同的表现形式。C++中实现多态有两种方式:函数模板。 下面是一个函数的例子: ```c++ class Shape { public: virtual double getArea() { return 0; } }; class Circle : public Shape { private: double radius; public: Circle(double r) { radius = r; } double getArea() { return 3.14 * radius * radius; } }; class Rectangle : public Shape { private: double width; double height; public: Rectangle(double w, double h) { width = w; height = h; } double getArea() { return width * height; } }; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值