-
Notifications
You must be signed in to change notification settings - Fork 8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
dynamic_cast
的描述不够严谨
#113
Comments
我觉得采用“运行时检查”的概念就很不好,混淆了语义和实现,应该抛弃之。
良构情况的语义问题(C++ 现行标准的文本写得很复杂,因为引入了“运行时检查”的概念,下面这个版本等效):
C++ 标准的规定:
这里的重点在于:
因此
这个说法不够全面。而
这个说法和现行 C++ 标准不一致。 最后,从实现效率考虑,假设编译器对
仓库原文里
这句话本身就很不明确:
应该特别注意,从基类到派生类,有两种模式(取决于 仓库原文里
不够全面——可以向上、向下、旁支转换。 还应该注意,派生类转基类,如果基类是 |
嗨,亲!谢谢你的来信,记得常联系哦!
|
您好,您所发送的邮件我已收到,但并不能代表着邮件已被读取或被正确理解。
|
信已收到,谢谢~~~
|
学到了🤣。 不过能详细聊一下嘛,以及
能举个例子嘛? |
其实另外一部分就提到了
如下: struct B1 { virtual f1();};
struct B2 { virtual f2();};
struct D: B1, B2 {};
void fun(B1 *p) {
auto p = dynamic_cast<B2*>(p);
} 此处从
这个转换要藉由 |
@Mq-b 后面问题的例子: struct B1 { virtual ~B1(); };
struct B2 { };
struct D : B1, B2 { };
D d;
B1 *b1 = &d;
// B1 和 B2 表面上没有继承关系
// b1 是 B1 * 而 B1 是多态类型
// b1 指向对象的最派生对象是 d
// d 里面的 b1 是公开基类 B1 的子对象
// d 有无歧义基类 B2 且 B2 是 D 的公开基类
// 转换得到这个 B2 基类子对象的指针
B2 *b2 = dynamic_cast<B2 *>(b1); @dynilath 的例子没有体现
准确来说,是不考虑访问性时选择无歧义且基类关系公开,注意有惟一公开基类、不惟一基类的时候,转换失败。 第一部分的问题,单纯是 C++ 标准,见 expr.dynamic.cast,下面假设
这里比较变态的点是关于 上面的叙述里“运行时检查”排除了 2、3、6、7。 |
我懒,而且这只是不幸的选词,而不是技术问题。 |
……正因此我建议通过 editorial issue 处理,如果是技术问题反而不该这么做。 |
写的是:
dynamic_cast< 新类型 >( 表达式 )
如果 表达式 是到多态类型
Base
的指针或引用,且 新类型 是到Derived
类型的指针或引用,那么会进行运行时检查。除此之外其他时候基本上是没有这种额外开销的。
并且它也可以用作其他的转换。
无虚函数,自然没有所谓的运行时检查。
当然了,没开销的时候说明不该使用
dynamic_cast
。感觉应该改成
The text was updated successfully, but these errors were encountered: