-2

私は基本クラスへのポインターをいじっていましたが、四角形のポインターを円のポインターにキャストし、四角形printradius()から関数を呼び出しました! 誰かがこれが許可されている理由を説明できますか? ありがとう。

#include <iostream>
#include <string>
using namespace std;

class Shape {
};

class Circle: public Shape {
    private:
        double radius;
    public:
        Circle(double r)
        { radius = r;}
    void printradius()
        { cout << "circle's radius is " << radius << endl;}
};

class Rectangle: public Shape {
    private:
        double width, length;
    public:
        Rectangle(double l, double w)
        { length = l; width = w;}
};

int main() {

    Rectangle r( 2.0, 2.0);   // only a rectangle is created
    Shape* s = &r;            // up cast into a shape
    Circle* c = static_cast<Circle*>(s); //down cast into a circle
    c->printradius();

}

出力:

円の半径は 2

4

2 に答える 2

3

「許可」って何?

言語は、そのような結果が未定義であることを明示的に述べているためstatic_cast、この場合、実際には「許可」されていません。Shape *からへの有効なダウンキャストを実行するには、 が実際に を指しているか、またはそこから派生したものCircle *であることを確認する必要があります。それ以外の場合、動作は未定義です。Shape *CircleCircle

コンパイラがそれをキャッチしなかった理由については...コンパイラは、実行時の条件に依存するエラーをキャッチできない可能性があります。一般に、コンパイラはポインタが実際に何を指しているかを知りませんs

言語がそのような機能を提供する理由については... 適切に使用すると非常に役立つため、提供されます。

于 2015-07-30T19:22:58.623 に答える