让我们假设以下代码编译:
int main()
{
A* p = new B(); // 1
C& c = p->method(); // 2
*c = *p; // 3
c = *p; // 4
}如果存在而不是,那么单个operator=就会要求类A、B、C和--而不是--对其中任何一个类都是一个转换操作符。
B是否有可能继承自A,继承自C?第3行和第4行如何编译?
发布于 2022-01-09 21:37:54
这条线
*c = *p
如果没有重载*操作符,就无法编译C。引用虽然与指针有很多相似之处,但并不是指针。它们不是内存地址,因此不能取消引用。相反,它们充当指针,每当使用时都会自动取消引用。此外,不能重新分配引用来指向不同的对象,因此,尽管如果将代码更改为c = *p,代码将编译,但它不会按预期工作。c仍然指向method返回的对象。
如果您将A、B和C作为指向C的指针而不是引用,并删除第4行,则可能会出现这样的关系。
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
}https://stackoverflow.com/questions/70631280
复制相似问题