惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

K
Kaspersky official blog
Martin Fowler
Martin Fowler
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
V
Visual Studio Blog
博客园_首页
Engineering at Meta
Engineering at Meta
The Cloudflare Blog
MongoDB | Blog
MongoDB | Blog
Blog — PlanetScale
Blog — PlanetScale
T
The Blog of Author Tim Ferriss
雷峰网
雷峰网
D
Docker
博客园 - 司徒正美
S
SegmentFault 最新的问题
M
MIT News - Artificial intelligence
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
U
Unit 42
J
Java Code Geeks
A
About on SuperTechFans
N
Netflix TechBlog - Medium
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Security Affairs
I
Intezer
Cisco Talos Blog
Cisco Talos Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
B
Blog RSS Feed
P
Privacy & Cybersecurity Law Blog
T
Tenable Blog
T
Threatpost
H
Hacker News: Front Page
G
Google Developers Blog
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
Apple Machine Learning Research
Apple Machine Learning Research
L
Lohrmann on Cybersecurity
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
A
Arctic Wolf
S
Secure Thoughts
GbyAI
GbyAI
NISL@THU
NISL@THU
S
Security @ Cisco Blogs
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Webroot Blog
Webroot Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
O
OpenAI News
Spread Privacy
Spread Privacy
Application and Cybersecurity Blog
Application and Cybersecurity Blog

博客园 - double64

C++ 安全的拷贝赋值(Copy-and-Swap 惯用法) visual studio 的 snippet 代码片段模板样式 Windows 右键管理官方小程序Autoruns C++ 结合 enum 按位与或组合检测枚举项 std::unique_ptr 当删除器类型为 无状态的时构造可以不用传删除器示例 两个用来写 CLI - Command-Line Interface 的命令解析库 enum class 类型转换 int 微软输入法中如何输出当前时间 音程知识 C++ 模板引用参数的各种情况 英语 12 种时态 Qt 手动添加 Q_OBJECT 需要添加的地方 C# WPF 绑定 ObservableObject 实现 INotifyPropertyChanged 接口 C++ 标准库 copy_if C++ lambda 和 bind 何时优先使用 Windows 下的 Qt 中 min max 函数冲突 C++ RVO 或 NRVO 可能触发的条件 C++ std::unique_ptr 和 std::shared_ptr 都支持自定义删除器(deleter) C++ 智能指针和动态数组 std::vector 插入另一个 vector 的范围元素 Qt tableWidget QTableWidget 常用一些属性设置 C++ 内部类(嵌套类)是可以访问外部类的私有保护成员的 C++ 宏展开顺序 C++ std::round() 四舍五入 cv::Mat 和 HalconCpp::HImage 生成和保存图像简单测试 简单易用的图像库:stb_image Halcon HImage 与 Qt QImage 的相互转换
C++ 基类派生类的 static_cast 和 dynamic_cast 转换的简单测试
double64 · 2026-05-29 · via 博客园 - double64

visual studio C++ 测试:

#include <iostream>
#include <algorithm>


class A
{
public:
    virtual ~A() {}
    A()
    {
        std::fill(arrA, arrA + 3, 1);
    }
    int arrA[3];
};


class B
{
public:
    B()
    {
        std::fill(arrB, arrB + 5, 5);
    }
    virtual ~B() {}
    int arrB[5]{ 5 };
};


class C :public A, public B
{
public:
    C()
    {
        std::fill(arrC, arrC + 7, 7);
    }
    int arrC[7];
};



int main()
{
    C *pC = new C;
    std::cout << "原对象,派生类地址:" << pC << '\n' << std::endl;
    A *pA = pC;
    std::cout << "基类 A 接收派生类地址:" << pA << '\n' << std::endl;
    B *pB = static_cast<C *>(pA);    // 没问题
    std::cout << "基类 B 接收派生类地址:" << pB << '\n' << std::endl;
    
    //B *pB1 = static_cast<B *>(pA);   // 编译器报错
   
    B *pB2 = pC;
    std::cout << "基类 B 接收派生类地址:" << pB2 << '\n' << '\n';

    //if (pA == pB2) { }    // 编译器报错,不能直接比较。

    auto pAVoid = static_cast<void *>(pA);
    auto pBVoid = static_cast<void *>(pB2);
    if (pAVoid == pBVoid) {  // 不相等
        std::cout << pAVoid << '\n';
    }
    else {
        std::cout << "static_cast 转换不相等:\n" << "a:" << pAVoid
            << '\n' << "b:" << pBVoid << '\n' << std::endl;
    }

    pAVoid = dynamic_cast<void *>(pA);
    pBVoid = dynamic_cast<void *>(pB2);
    if (pAVoid == pBVoid) {  // 相等
        std::cout << "dynamic_cast 转化相等,地址:" << pAVoid << '\n' << std::endl;
    }

    getchar();
    return 0;
}

输出:

原对象,派生类地址:0000019BF212D150

基类 A 接收派生类地址:0000019BF212D150

基类 B 接收派生类地址:0000019BF212D168

基类 B 接收派生类地址:0000019BF212D168

static_cast 转换不相等:
a:0000019BF212D150
b:0000019BF212D168

dynamic_cast 转化相等,地址:0000019BF212D150

结果:

  1. A, B 兄弟类型之间不能 static_cast 转换,只能 dynamic_cast 转换;
  2. 在明确知道基类指针指向的时派生类时,可以 static_cast 转换成派生类给兄弟类指针接收。
  3. 第一基类 A 的地址和原始对象地址相等;
  4. 兄弟类指针虽然都接受的同一派生类对象,但地址是有偏置的,直接 static_cas<void *> 是不相等的,但 dynamic_cast<void *> 转换后都升到派生类地址,从而比较是相等的。 // 是不是直接 dynamic_cast<C *> 更为直观