C++ RTTI行为未按预期出现

C++ RTTI行为未按预期出现,c++,rtti,C++,Rtti,我在MS Visual Studio Express 2012中编写了此代码,以查看rtti行为。 但它没有按预期工作。 我的代码有什么问题 Shape.h class Shape { public: Shape(){} virtual ~Shape(){} virtual double area() = 0; }; class Square : public Shape { int a; public: ~Square(){} Square(i

我在MS Visual Studio Express 2012中编写了此代码,以查看rtti行为。
但它没有按预期工作。
我的代码有什么问题

Shape.h

class Shape
{
public:
    Shape(){}
    virtual ~Shape(){}
    virtual double area() = 0;
};

class Square : public Shape
{
    int a;
public:
    ~Square(){}
    Square(int );
    virtual double area();
};

class Rectangle : public Shape
{
    int l;
    int b;
public:
    ~Rectangle(){}
    Rectangle(int,int);
    virtual double area();
};

class Circle : public Shape
{
    int r;
public:
    ~Circle(){}
    Circle(int);
    virtual double area();
};
int main()
{
    Shape* c = new Circle(4);
    cout<< "Area of circle:" << c->area() << endl;
    cout << typeid(c).name();

    Shape* s = new Square(4);
    cout<< "Area of square:" << s->area() << endl;
    cout << typeid(s).name();

    Shape* r = new Rectangle(4,5);
    cout<< "Area of rectangle:" << r->area() << endl;
    cout << typeid(r).name();

}
Area of circle:50.24
class Shape *           //Expected class Circle*
Area of square:16
class Shape *           //Expected class Square*
Area of rectangle:20
class Shape *           //Expected class Rectangle*   
ShapeMain.cpp

class Shape
{
public:
    Shape(){}
    virtual ~Shape(){}
    virtual double area() = 0;
};

class Square : public Shape
{
    int a;
public:
    ~Square(){}
    Square(int );
    virtual double area();
};

class Rectangle : public Shape
{
    int l;
    int b;
public:
    ~Rectangle(){}
    Rectangle(int,int);
    virtual double area();
};

class Circle : public Shape
{
    int r;
public:
    ~Circle(){}
    Circle(int);
    virtual double area();
};
int main()
{
    Shape* c = new Circle(4);
    cout<< "Area of circle:" << c->area() << endl;
    cout << typeid(c).name();

    Shape* s = new Square(4);
    cout<< "Area of square:" << s->area() << endl;
    cout << typeid(s).name();

    Shape* r = new Rectangle(4,5);
    cout<< "Area of rectangle:" << r->area() << endl;
    cout << typeid(r).name();

}
Area of circle:50.24
class Shape *           //Expected class Circle*
Area of square:16
class Shape *           //Expected class Square*
Area of rectangle:20
class Shape *           //Expected class Rectangle*   
typeid()
仅当传递多态类型的左值时才实际执行RTTI查找
Shape
是一种多态类型,但您传递的不是
Shape
lvalue,而是
Shape*
。因此,当您将
c
s
r
传递到
typeid()
时,它会报告这些表达式的静态类型,即
Shape*

要获得运行时查找,您可以取消对指针的引用:
std::cout