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

推荐订阅源

V
Vulnerabilities – Threatpost
U
Unit 42
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
F
Full Disclosure
月光博客
月光博客
Engineering at Meta
Engineering at Meta
博客园_首页
The Register - Security
The Register - Security
G
Google Developers Blog
The Cloudflare Blog
博客园 - Franky
K
Kaspersky official blog
A
Arctic Wolf
Scott Helme
Scott Helme
C
Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
C
Check Point Blog
NISL@THU
NISL@THU
AI
AI
D
DataBreaches.Net
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
Project Zero
Project Zero
The GitHub Blog
The GitHub Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Vercel News
Vercel News
T
Tor Project blog
P
Privacy International News Feed
D
Docker
I
Intezer
L
LangChain Blog
P
Proofpoint News Feed
Security Latest
Security Latest
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
博客园 - 聂微东
AWS News Blog
AWS News Blog
Martin Fowler
Martin Fowler
P
Privacy & Cybersecurity Law Blog
V
V2EX
Last Week in AI
Last Week in AI
C
Cybersecurity and Infrastructure Security Agency CISA
The Hacker News
The Hacker News
T
Tenable Blog
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS 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 *> 更为直观