当前位置:主页   - 电脑 - 程序设计 - C/C++
C++箴言:绝不重定义继承的非虚拟函数
来源:网络   作者:   更新时间:2012-02-18
收藏此页】    【字号    】    【打印】    【关闭

  假设我告诉你 class(类)D 从 class(类)B publicly derived(公有继承),而且在 class(类)B 中定义了一个 public member function(公有成员函数)mf。mf 的参数和返回值类型是无关紧要的,所以我们就假设它们都是 void。换句话说,我的意思是:

class B {
 public:
  void mf();
  ...
};
class D: public B { ... };

  甚至不必知道关于 B,D,或 mf 的任何事情,给定一个类型为 D 的 object(对象)x,

D x; // x is an object of type D

  对此你或许非常吃惊,

B *pB = &x; // get pointer to x
pB->mf(); // call mf through pointer

  的行为不同于以下代码:

D *pD = &x; // get pointer to x
pD->mf(); // call mf through pointer

  因为在两种情况中,你都调用了 object(对象)x 中的 member function(成员函数)mf。因为两种情况中都是同样的 function(函数)和同样的 object(对象),它们的行为应该有相同的方式,对吗?

  是的,应该。但是也可能不,特别地,如果 mf 是 non-virtual(非虚拟)而 D 定义了它自己的版本的 mf:

class D: public B {
 public:
  void mf(); // hides B::mf; see Item33
  ...
};
pB->mf(); // calls B::mf
pD->mf(); // calls D::mf

  这种行为两面性的原因是像 B::mf 和 D::mf 这样的 non-virtual functions(非虚拟函数)是 statically bound(静态绑定)的(参见 Item 37)。这就意味着因为 pB 被声明为 pointer-to-B 类型,所以,即使就像本例中的做法,让 pB 指向一个从 B 继承的类的对象,通过 pB 调用的 non-virtual functions(非虚拟函数)也总是定义在 class B 中的那一个。

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明