IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> (C++)upcast的时候一定要用 dynamic_cast 吗? -> 正文阅读

[C++知识库](C++)upcast的时候一定要用 dynamic_cast 吗?

如果是多继承,并且 upcast到不同的接口的时候,需要用dynamic_cast

比如,下面的代码,第37行一定要用 dynamic_cast,因为它是从一个 基类接口转到另外一个基类借口。

     1	class A
     2	{
     3	public:
     4	virtual bool IsA(void) = 0;
     5	protected:
     6	int t_a;
     7	};
     8	
     9	class B
    10	{
    11	public:
    12	virtual bool IsB( void ) = 0;
    13	protected:
    14	int t_b;
    15	};
    16	
    17	class C: public A, public B
    18	{
    19	public:
    20	
    21	C(){}
    22	~C(){}
    23	bool IsA(void) { return true;}
    24	bool IsB(void) { return true;}
    25	
    26	virtual bool isC(void){return true;}
    27	private:
    28	int m_c;
    29	};
    30	
    31	int main(void)
    32	{
    33		A *pA = new C;
    34	
    35		C * pC = (C*)pA;
    36		B *pB = (B*)pA;
    37		B *pB2 = dynamic_cast<B*>(pA);
    38	
    39		return 0;
    40	}

使用GDB打印变量的值:

(gdb) p pA
$2 = (A *) 0x804fa10
(gdb) p pB
$3 = (B *) 0x804fa10
(gdb) p pB2
$4 = (B *) 0x804fa18

可以看到,pB 和 pB2的值不一样。

使用命令

clang -cc1 -fdump-record-layouts

打印出类的内存分布:

*** Dumping AST Record Layout
         0 | class A
         0 |   (A vtable pointer)
         4 |   int t_a
           | [sizeof=8, dsize=8, align=4,
           |  nvsize=8, nvalign=4]

*** Dumping AST Record Layout
         0 | class B
         0 |   (B vtable pointer)
         4 |   int t_b
           | [sizeof=8, dsize=8, align=4,
           |  nvsize=8, nvalign=4]

*** Dumping AST Record Layout
         0 | class C
         0 |   class A (primary base)
         0 |     (A vtable pointer)
         4 |     int t_a
         8 |   class B (base)
         8 |     (B vtable pointer)
        12 |     int t_b
        16 |   int m_c
           | [sizeof=20, dsize=20, align=4,
           |  nvsize=20, nvalign=4]

可以看到,类B在 C 对象上的偏移为 8, 可以看到,dynamic_cast后的值就是对应的B类的地址。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-19 11:41:26  更:2021-10-19 11:42:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:30:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码