条款34:区分接口继承和实现继承

在设计类的继承时,一般有三种想法:

1 只继承函数接口

2 继承函数接口及其实现,并且允许修改该实现

3 继承函数接口及其实现,但是不允许修改该实现

 

考虑如下例子: 

 1 #include <iostream>
 2 
 3 class Shape
 4 {
 5 public:
 6     virtual void draw() = 0;                       // 只提供接口
 7     virtual void error(const std::string& msg);    // 提供接口的同时提供一份默认的实现,派生类可以修改为自己的实现版本
 8     int objectID() const;                          // 提供接口的同时提供一份强制性的实现,派生类一般不应该修改该实现
 9 };
10 void Shape::error(const std::string& msg)   // 接口的默认实现
11 {
12 
13 }
14 int Shape::objectID() const                 // 接口的强制实现
15 {
16     return 0;
17 }
18 
19 class Rectangle : public Shape
20 {
21     virtual void draw();
22 };
23 void Rectangle::draw(){}
24 
25 int main()
26 {
27     int id;
28     Shape* ps1 = new Rectangle;
29     ps1->draw();                             // 调用Rectangle::draw
30     ps1->error("Shape::error");              // 调用Shape::error
31     id = ps1->objectID();                    // 调用Shape::objectID
32 
33     return 0;
34 }

 

总结:

  • 声明一个纯虚函数的目的是为了让派生类只继承函数接口,不必提供实现
  • 声明虚函数的目的是提供接口的同时提供一份默认的实现,派生类可以修改为自己的实现版本
  • 声明非虚函数的目的是提供接口的同时提供一份强制性的实现,派生类一般不应该修改该实现(就像上例中的objectID函数,其函数体总是由相同计算方式得到的,因此不必在派生类中修改)

转载于:https://www.cnblogs.com/benxintuzi/p/4525475.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值