次のコードには、クラスが定義されているいくつかのヘッダーファイルが含まれています。 area, circle, ring, rectangle, pattern
。 area
は基本クラス、円は派生クラスです。 ring
およびrectangle
は、circle
の派生語であり、pattern
は、長方形の穴を含む色付き円の幾何学的図形を記述するcircle
およびrectangle
の両方の派生語である。クラスarea
は、color
の変数を定義します。これは、double derivationがpattern
に2回含まれるためです。とにかく、私はあなたが一緒に従うことができる方法でこの質問を述べることができることを願っています!私は理解していないが第三最後の行のキャストが二重導出 - キャストが必要な理由
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
のデータが2回含まれているため、キャストが必要であると記載されています。しかし、私はこの推論を理解していません。
"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
クラスとその継承階層の説明のみではなく、[最小、**完全**、および検証可能な例](http://stackoverflow.com/help/mcve)を作成してください。 –
ヘッダー全体を投稿する必要はありません。しないでください。しかし、[mcve]を作成する必要があります。あなたの場合、これはおそらくすべてのクラスの定義だけを意味します**空のボディ**を持ちます。ちょうどそれがコンパイルしてあなたの問題を示しているように。 – bolov
'blue_pattern'は本当に' circle'の子クラスですか?それではないかと思います。 – Bathsheba