接口继承与实现继承
2016-01-22 14:09
253 查看
继承可以从两方面理解:
1接口继承,只继承函数的接口(声明),需要在派生类中定义继承过来的纯虚函数。
2实现继承,同时继承接口与实现,可以重新定义继承的函数,也可以不重新定义。另外还有:子类不能重新定义继承的函数,这类函数就是普通的函数,非虚函数。
接口继承:
比如上面两个类,Animal类attack函数是纯虚函数,这使得Animal是一个抽象类,无法实例化(即使为纯虚函数提供了定义也一样不能实例化)。对于动物种类有很多种,但是我们不知道他们的攻击方式比如抓、咬、毒液、捆绑等等。在定义Animal类的时候,我们并不知道应该如何来实现attack函数,所以将它声明为纯虚函数,由派生类来定义,即告诉子类”你必须提供一个attack函数,但我不知道你怎么去实现它“,定义纯虚函数的目的就是子类只继承函数的接口。
有时候声明一个只含有纯虚函数的类很有用,这种类称为协议类(Protocol Class),他只为子类提供接口,完全不提供实现。
实现继承:
普通的虚函数和纯虚函数不一样,普通的虚函数一般提供了函数的实现,所以子类继承了函数的接口以及实现。但是子类可以选择重新定义或不定义这个函数而是用缺省实现。即告诉子类”你可以重新定义这个虚函数,或者使用缺省实现“。比如上面的getClass函数,可以重新定义,具体输出某个动物类别,也可以缺省实现而输出animal这个大类。
有了纯虚函数、简单虚函数和非虚函数,就可以决定子类继承哪种:仅接口继承、接口继承和缺省实现、接口继承和强制实现
两种极端:
1全都声明为非虚函数,这个问题从虚析构函数的必要性就可以看出,但是如果一个类永远不会作为基类,这么做也没错。
2全都声明为虚函数,有时这没问题,比如协议类就是这样的例子,但全是虚函数就代表派生类可以利用它来做任何事,这有时也会带来问题。
所以声明时应该慎重选择成员函数的种类。
1接口继承,只继承函数的接口(声明),需要在派生类中定义继承过来的纯虚函数。
2实现继承,同时继承接口与实现,可以重新定义继承的函数,也可以不重新定义。另外还有:子类不能重新定义继承的函数,这类函数就是普通的函数,非虚函数。
class Animal { public: virtual void attack()=0; virtual void getClass() { cout<<"Animal"<<endl; } }; class Tiger:public Animal{ public: void attack() { cout<<"Tiger Attack"<<endl; } void getClass() { cout<<"Tiger"<<endl; } };
接口继承:
比如上面两个类,Animal类attack函数是纯虚函数,这使得Animal是一个抽象类,无法实例化(即使为纯虚函数提供了定义也一样不能实例化)。对于动物种类有很多种,但是我们不知道他们的攻击方式比如抓、咬、毒液、捆绑等等。在定义Animal类的时候,我们并不知道应该如何来实现attack函数,所以将它声明为纯虚函数,由派生类来定义,即告诉子类”你必须提供一个attack函数,但我不知道你怎么去实现它“,定义纯虚函数的目的就是子类只继承函数的接口。
有时候声明一个只含有纯虚函数的类很有用,这种类称为协议类(Protocol Class),他只为子类提供接口,完全不提供实现。
实现继承:
普通的虚函数和纯虚函数不一样,普通的虚函数一般提供了函数的实现,所以子类继承了函数的接口以及实现。但是子类可以选择重新定义或不定义这个函数而是用缺省实现。即告诉子类”你可以重新定义这个虚函数,或者使用缺省实现“。比如上面的getClass函数,可以重新定义,具体输出某个动物类别,也可以缺省实现而输出animal这个大类。
有了纯虚函数、简单虚函数和非虚函数,就可以决定子类继承哪种:仅接口继承、接口继承和缺省实现、接口继承和强制实现
两种极端:
1全都声明为非虚函数,这个问题从虚析构函数的必要性就可以看出,但是如果一个类永远不会作为基类,这么做也没错。
2全都声明为虚函数,有时这没问题,比如协议类就是这样的例子,但全是虚函数就代表派生类可以利用它来做任何事,这有时也会带来问题。
所以声明时应该慎重选择成员函数的种类。
相关文章推荐
- iOS Mob短信验证码
- 使用FreeType实现DirectX11的文本输入
- 如何将url作为一个参数放到另一个url中
- opencv:Load Caffe framework models
- 【spring源代码分析】--Bean的解析与注冊
- 邻接矩阵学习
- ubuntu编译安装nginx
- 样式化复选框
- 在Linux上安装Memcached服务
- 判断字符串是否为中文
- 数字证书原理
- ft232rl可以了
- Hive学习1_hive配置遇到的问题:Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%
- mmnl进程无故终止的一些事
- C++:运算符重载1(分数的加法)
- /dev/null 的含义和用途
- 【转】Spark是基于内存的分布式计算引擎
- 被遗忘的 Logrotate
- IOS开发:手势画板涂鸦
- ZOJ1045-HangOver