【发布时间】:2013-12-31 07:37:54
【问题描述】:
不是我有问题,而是我发现以下事实很奇怪。
/* Class Shape */
class Shape
{
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
int area()
{
cout << "Parent class area :" <<endl;
return 0;
}
};
/* Class Triangle */
class Triangle: public Shape
{
public:
Triangle( int a=0, int b=0)
{
Shape(a, b);
}
int area ()
{
cout << "Triangle class area :" <<endl;
return (width * height / 2);
}
};
int main( )
{
Shape *shape;
Triangle tri(10,7);
shape = &tri;
(*shape).area();
return 0;
}
上面将打印的是:“父类区域:”。
所以编译器似乎没有检查指针内容?并且仅基于指针类型调用方法?否则它会看到 *shape 是一个 Triangle 对象并且会调用三角形版本的 area 不是吗?
ps。我知道你可以使用虚函数让它按照我描述的方式工作,但这不是我现在感兴趣的,只是我发现这种行为有点奇怪,也许我错过了一些东西。
【问题讨论】:
-
指针内容是运行时的。那不是编译器的工作。编译器的工作是检查语法并将您的程序转换为可以通过链接器链接在一起的目标文件。任何形式的情报,例如知道指针内容和警告您可能正在做一些非法的事情,都是一种附加功能。如果 Shape::area 是虚拟的,它只会调用三角形版本。
标签: c++