当前位置: 首页 > news >正文

【Effective C++】36绝不重新定义继承而来的non-virtual 函数

例子如下:

class B {
public:void mf();
};class D : public B {};D x;		// x是一个类型为D的对象
// 方式一
B* pB = &x  // 获得一个pB 指向 x
pB->mf();	// 经由指针调用mf// 方式二
D* pD = &x	// 获得一个指针指向x
pD->mf();	// 经由指针调用mf

我们期望方式一和方式二调用mf 的表现是一致的。但是如果 D的实现如下

class D : public B {
public:void mf();		// 遮掩了B
};

此时方式一和方式二的表现形式就不一致了,造成这一行为的原因是: non-virtual 函数是 B::mf和D::mf都是静态绑定。意思是,由于pB是申明为指向B的指针,通过pB调用non-virtual函数永远是B所定义的版本,即时pB指向一个类型为B的派生类。

但是 virtual 函数却是动态绑定的。所以最后调用mf的时候都是调用了实际的类的哪个mf。
测试一下:

class B {
public:void mf(){std::cout << "B::mf()" << std::endl;}
};class D : public B {
public:void mf(){std::cout << "D::mf()" << std::endl;}
};int main()
{D d;std::cout << "call d.mf(): ";d.mf(); // D::mf()B* pb = &d;std::cout << "call pb->mf(): ";pb->mf(); // B::mf()D* pd = &d;std::cout << "call pd->mf(): ";pd->mf(); // D::mf()return 0;
}

输出:

call d.mf(): D::mf()
call pb->mf(): B::mf()
call pd->mf(): D::mf()
http://www.lryc.cn/news/321568.html

相关文章:

  • STM32-DMA数据转运
  • Vue 3 + TypeScript 项目中全局挂载并使用工具函数
  • 第二门课:改善深层神经网络<超参数调试、正则化及优化>-超参数调试、Batch正则化和程序框架
  • 漫谈微服务网关
  • 进击的PostgreSQL
  • 本地gitlab-runner的创建与注册
  • 《UE5_C++多人TPS完整教程》学习笔记28 ——《P29 Mixamo 动画(Mixamo Animations)》
  • 剑指offer力扣题集
  • 【商业|数据科学主题会议推荐】2024年商业分析与数据科学国际学术会议(ICBADS 2024)
  • 爬虫技术实战案例解析
  • Git 使用笔记
  • python -- 语法与变量
  • 24计算机考研调剂 | 太原科技大学
  • Leetcode 204. 计数质数 java题解
  • 机器学习——终身学习
  • 一次完整的 HTTP 请求所经历的步骤
  • OpenGL学习笔记【1】——简介
  • C语言课后作业 20 题+考研上机应用题
  • macOS上基于httpd-dav搭建WebDav服务
  • Java-设计模式-单例模式
  • 图片html5提供的懒加载与vue-lazyload的区别
  • golang 根据某个特定字段对结构体的顺序进行排序
  • React Router 参数使用详解
  • Vue中$set用法解析
  • 进制,码制及其表示范围
  • 钡铼技术R40工业4G路由器加速推进农田水利设施智能化
  • 基于龙芯2k1000 mips架构ddr调试心得(一)
  • 智能合约语言(eDSL)—— 使用rust实现eDSL的原理
  • 敏捷开发——elementUI/Vue使用/服务器部署
  • uniapp 使用sqlite时无法读取到db文件中的数据