gpt4 book ai didi

c++ - 双重推导 - 为什么强制转换是必要的

转载 作者:搜寻专家 更新时间:2023-10-31 02:09:21 24 4
gpt4 key购买 nike

下面的代码包含了几个定义了类的头文件:面积、圆形、环形、矩形、图案area是基础类,circle是派生类。 ringrectanglecircle 的派生词,patterncircle 的派生词和 rectangle,描述了一个彩色圆圈的几何图形,其中包含一个矩形孔。 area 类定义了一个变量color,由于双重推导,该变量将两次包含在pattern 中。无论如何,我希望我能以一种您可以跟进的方式陈述这个问题!

考虑这段代码:

int main() {
area *list[8];
ring blue_ring("BLUE",5,2);
pattern blue_pattern("BLUE",30,5,5);
list[0]=&blue_ring;
list[4]=static_cast<circle *>(&blue_pattern);
return 0;
}

我不明白的是倒数第三行的转换。对象 blue_pattern 的类型为 pattern。嗯,指针数组 list 存储指向 area 类型对象的地址。那么为什么我必须将 blue_pattern 转换为 circle 类型的对象。这是编程初学者书中的示例。它在那里说强制转换是必要的,因为对象 pattern 两次包含来自 area 的数据。但是我不明白这个推理。

这里是我尝试提供最少的代码,这只是 header :

“example0051.h”

#ifndef _AREA_
#define _AREA_
class area {
public:
area(char * n);
~area();
void getColor() const;
private:
char color[11];
};

#endif

“example0052.h”

#ifndef _CIRCLE_
#define _CIRCLE_
#include "example0051.h"

class circle : public area {
public:
circle(char * n, float a);
~circle();

float calculateArea() const;
private:
float radius;
};

#endif

“example0054.h”

#ifndef _RECTANGLE_
#define _RECTANGLE_
#include "example0051.h"

class rectangle : public area {
public:
rectangle(char * n, float a, float b);
~rectangle();
float calculateArea() const;
private:
float length;
float width;
};

#endif

“example0055.h”

#ifndef _PATTERN_
#define _PATTERN_
#include "example0052.h" // circle
#include "example0054.h" // rectangle

class pattern : public circle, public rectangle {
public: pattern(char * n, float a, float b, float c);
~pattern();
float calculateArea() const;
};

#endif

最佳答案

请注意您的层次结构:

  area        area
^ ^
| |
| |
rectangle circle
^ ^
\ /
\ /
\ /
pattern

所以pattern *可以通过两种方式转换为area *。编译器无法自行决定哪个版本更有效,因此它会打印错误。

当添加到 circle * 的转换时,很清楚如何执行到 area * 的转换。

可能在下一步中您将了解虚拟继承和菱形问题,但在我看来这个例子很糟糕,这应该通过组合而不是多重继承来解决。

关于c++ - 双重推导 - 为什么强制转换是必要的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46644520/

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