c++ - 双重推导 - 为什么需要强制转换

标签 c++ inheritance

以下代码包含几个定义类的头文件: 区域、圆形、环形、矩形、图案area是基类,circle是派生类。 ringrectanglecircle 的派生,patterncircle 的派生和矩形,描述彩色圆圈的几何图形,其中包含矩形孔。类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/

相关文章:

c++ - 将 GTest 集成到我的项目时 gtest-printers.h 出错

javascript - 在Javascript中, 'Object.create'和 'new'的区别

inheritance - 具有多个构造函数语法的 F# 继承

c++ - 如何使用 Excel12v C 接口(interface)设置单元格值

c++ - C++中动态数组的长度

c++ - 继承和智能指针 (std::shared_ptr)

c++ - 当保护保护太多

java - 覆盖 toString 但仍然使用它来完成工作

c++ - 访问对象 unique_ptr 指向

c++ - 如何在 Xcode 9.3 中显示 C++ 代码文档?