假设编译了以下代码:
int main()
{
A* p = new B(); // 1
C& c = p->method(); // 2
*c = *p; // 3
c = *p; // 4
}
给定存在not期望类A
、B
、C
的单个operator=
,并且no将单个强制转换运算符转换为这些运算符中的任何运算符。
B
有可能从A
继承C
吗?第3行和第4行怎么可能同时编译?
此行
*c = *p
如果不重载CCD_ 10的CCD_。引用虽然与指针有很多相似之处,但不是指针。它们不是内存地址,因此不能取消引用。相反,它们充当指针,无论何时使用,都会自动取消引用。此外,不能重新分配引用以指向不同的对象,因此,尽管如果将代码更改为c = *p
,代码会编译,但它不会按预期工作。CCD_ 12将仍然指向CCD_ 13返回的对象。
如果将c
设置为指向C
的指针而不是引用,并删除第4行,则可能会出现您所描述的A
、B
和C
之间的关系。代码看起来是这样的:
int main()
{
A* p = new B(); // works because B inherits from A
C* c = p->method(); // works because is "method" is a member function
// of A and returns a pointer to an instance of C
c* = *p; // works because A inherits from C
}