以下代码包含几个定义类的头文件:
区域、圆形、环形、矩形、图案
。 area
是基类,circle是派生类。 ring
和 rectangle
是 circle
的派生,pattern
是 circle
的派生和矩形
,描述彩色圆圈的几何图形,其中包含矩形孔。类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
的数据两次。但我不明白这个道理。
这是我尝试提供最少的代码,只是标题:
“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/