-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是未定义的,因此在这种情况下它并不是真正“允许的”。为了从 to 执行有效的向下转换Shape *Circle *您必须确保Shape *实际指向 toCircle或派生自 的东西Circle。否则,行为未定义。

至于为什么编译器没有捕捉到它......编译器不可能捕捉到依赖于运行时条件的错误。在一般情况下,编译器不知道您的s指针实际指向什么。

至于为什么该语言甚至提供这样的功能......它提供它是因为当一个人正确使用它时它会非常有用。

于 2015-07-30T19:22:58.623 回答
0

静态转换是“因为我说过。”,换句话说,相信我,程序员,事情就是我所说的,在这种情况下是一个圆指针。调用该printradius()方法时,this指针是 for r,而当printradius()恰好 deref 查找半径时,它会找到第一个 double,其值为 2.0。以这种方式运行没有崩溃或报告错误,但如您所知,这没有任何意义。

使用动态转换并检查返回的值。您将看到 null,因为矩形和圆形不一样。

于 2015-07-30T19:24:19.540 回答