gpt4 book ai didi

c++ - 涉及私有(private)继承的 C 风格向上转型和向下转型

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:42 25 4
gpt4 key购买 nike

考虑以下代码:-

class A {};

class B : private A {};

B* bPtr1 = new B;
// A* aPtr1 = bPtr1; // error
// A* aPtr2 = static_cast<A*>(bPtr1); // error
A* aPtr3 = (A*)bPtr1;
B* bPtr2 = (B*)aPtr3;

当隐式和static_cast 都失败时(还有dynamic_cast),C 风格的转换丢弃了私有(private)继承。为什么 ?如果 C 风格的转换只是一些小事,那么 C++ 转换是如何实现的,即它们如何从内存占用中知道继承类型?

在将 bPtr1 转换为 aPtr3 之后,我将不得不使用另一个 C 风格的转换来向下转换为 B,因为 static_castdynamic_cast 都失败了。那么,bPtr2 是否保证是好的?

提前致谢

最佳答案

标准在 5.4.7 中声明 C 风格的转换实际上比任何新风格的转换序列可以做的更多——特别包括从派生指针到指针的转换-to-base 即使基类不可访问,这正是私有(private)继承所发生的情况。 (为什么这应该被允许,特别是为什么它应该只允许用于 C 风格的转换,这完全超出了我的范围;但不可否认这是允许的。)

所以 dribeas 是对的,编译器有义务正确处理 OP 的 C 风格指针转换,即使在 B 时也是如此。继承自多个基类。我自己使用 MSVC++8 和 MinGW 进行的测试证实了他在实践中的结果——当 B继承自多个基类,编译器在转换一个B*时会调整指针到A*反之亦然,以便识别正确的对象或子对象。

我坚持我的断言,你应该推导出 B 公开 来自A如果你打算治疗 B作为A ,因为使用私有(private)继承需要使用 C 风格的转换。

关于c++ - 涉及私有(private)继承的 C 风格向上转型和向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/844816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com