C++ 何时以及如何决定是否使用石膏?
我正经历着,“”。以下摘录摘自同一页(第5/17页) 4.4铸造 显式和隐式强制转换还可能涉及使用增量修改指针值:C++ 何时以及如何决定是否使用石膏?,c++,pointers,casting,language-design,language-concepts,C++,Pointers,Casting,Language Design,Language Concepts,我正经历着,“”。以下摘录摘自同一页(第5/17页) 4.4铸造 显式和隐式强制转换还可能涉及使用增量修改指针值: class A { void f(); }; class B { int f(); }; class C : A, B { }; C* pc; B* pb; pb = (B*)pc; // pb = (B*)((char*)pc+delta(B)) pb = pc; // pb = (B*)((char*)pc+delta(B)) pc = pb; // error: ca
class A { void f(); };
class B { int f(); };
class C : A, B { };
C* pc;
B* pb;
pb = (B*)pc; // pb = (B*)((char*)pc+delta(B))
pb = pc; // pb = (B*)((char*)pc+delta(B))
pc = pb; // error: cast needed <-------------------- HERE
pc = (C*)pb; // pc = (C*)((char*)pb-delta(B))
类{void f();};
类B{int f();};
C类:A,B{};
C*pc;
B*pb;
pb=(B*)pc;//pb=(B*)((char*)pc+delta(B))
pb=pc;//pb=(B*)((char*)pc+delta(B))
pc=pb;//错误:cast needed编译器知道,指向
C
的指针可以被引用,就像继承的class a
或B
一样,因此可以隐式地进行a
或B
的转换。相反,编译器不知道指针指向C
的对象。它可能是另一个类,也继承了a
。通过添加cast,您实际上是在说“别担心编译器-我知道它实际上是一个C类型的类”。在您的例子中,它非常简单。您试图将指向类B
对象的指针指定给指向类C
对象的指针
就其本身而言,您无法做到这一点,因为类
C
的对象还提供类A
的功能,而类B
的对象不提供这些功能。因此,在预期对象C
的情况下使用B
类的对象是未定义的,因为B
不能提供C
所拥有的一切。这与我们知道的对象所拥有的类型有关。每个C
也是一个B
,因此转换始终有效(隐式)
每个B
都不是C
的一部分,因此您必须告诉编译器,您肯定知道这个特定的转换将起作用。这就是显式转换的使用。关于非基本类型允许的隐式转换,如下所示:
- 空指针可以转换为任何类型的指针
- 指向任何类型的指针都可以转换为空指针
- 指针向上转换:指向派生类的指针可以转换为可访问且明确的基类指针,而无需修改其
或const
限定volatile
C*
向上转换到aB*
时,不需要显式转换。但是,由于从aB*
到aC*
的转换是指针向下转换,因此可以使用C型转换,但最好使用以下方式之一:
- 如果表达式为a
且新类型为aB*
,则可以使用此选项。将执行此运行时检查,并且1应允许向下广播:C*
- 可以使用,并且将永远成功。但只有当
为AliasedType且B
为DynamicType且满足以下条件之一时,才能定义其结果的使用,第二个项目符号允许向下投射:C
- AliasedType是(可能是cv限定的)DynamicType
- AliasedType和DynamicType都是指向同一类型T的指针(可能是多级的,也可能是每个级别的cv限定)
- AliasedType是DynamicType的有符号或无符号变体(可能是cv限定的)
- AliasedType是一种聚合类型或联合类型,它将上述类型之一作为元素或非静态成员(递归地包括子聚合的元素和包含的联合的非静态数据成员)保存:这使得在给定指向结构或联合的非静态成员或元素的指针时,可以安全地获取指向该结构或联合的可用指针
- AliasedType是DynamicType的基类(可能是cv限定的)
- AliasedType是
或char
:这允许检查任何对象作为unsigned char数组的对象表示形式unsigned char
- 当且仅当已知
实际上以多态方式寻址B*
对象时,也可以使用。如果情况并非如此,并且尝试执行C
,则会导致未定义的行为静态\u cast
因此**向下转换**到A或B可以隐式进行
我不认为,你的意思是向下转换。不过,谢谢你的回答。抢手货改变了的,