【发布时间】:2015-07-30 19:16:06
【问题描述】:
我正在玩弄指向基类的指针,我将一个矩形指针转换为一个圆形指针,并从矩形中调用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
【问题讨论】:
-
这是简单的未定义行为。
-
顺便说一句,您应该在构造函数
Rectangle(double l, double w):length(l),width(w){}中使用初始化语法。至于您的问题,可能是因为从Circle类开始的内存偏移量恰好与Rectangle类中宽度或长度之一的内存偏移量相同。因此,当调用print_radius时,会查找某个偏移量,巧合 会查找一个有效的双精度。你不应该依赖它,因为它是未定义的行为。假设内存布局发生变化或其他实现会破坏其他实现。
标签: c++ function virtual upcasting