2014-01-10 4 views
-1

В следующем коде в основной функции форма объявляется как указатель на объект класса Shape, но адрес объекта класса Rectangle, а именно rec, сохраняется в следующей строке. скажи мне, где я ошибаюсь в своем понимании.Пример указателя на объект класса в C++

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 Rectangle: public Shape{ 
    public: 
     Rectangle(int a=0, int b=0) 
     { 
     Shape(a, b); 
     } 
     int area() 
     { 

     return (width * height); 
     } 
}; 
class Triangle: public Shape{ 
    public: 
     Triangle(int a=0, int b=0) 
     { 
     Shape(a, b); 
     } 
     int area() 
     { 

     return (width * height/2); 
     } 
}; 


int main() 
{ 
    Shape *shape;//pointer to Shape class 
    Rectangle rec(10,7); 
    Triangle tri(10,5); 


    shape = &rec;//address of Rectangle class object saved 
    shape->area(); 

    shape = &tri; 
    shape->area(); 

    return 0; 
} 
+1

Что вы на самом деле спрашиваете? Может быть, вы можете уточнить свой вопрос. – juanchopanza

+0

Прямоугольник - это форма. См. «Наследование» – manuell

+0

Вам нужно вернуться и перечитать разделы по объектно-ориентированному программированию. –

ответ

3

Shape должен объявить area как virtual получить полиморфное поведение.

virtual int area() 
{ 
... 
} 
0

Rectangle является производным от Shape см линию

class Rectangle: public Shape 

Это называется наследование или «является разновидностью» отношение: а Rectangle является Shape. Поэтому Shape* может указывать на прямоугольник. Более подробную информацию можно найти, например, в Base class pointer vs inherited class pointer? или в большинстве учебных пособий на C++, охватывающих наследование.

как ответ ноты Родди, однако, вы должны объявить area в Shape как virtual, в противном случае вызова shape->area() всегда будет вызывать Shape «s area метод вместо переопределяется метод, предоставляемый Rectangle. Поскольку area для Shape на самом деле не имеет смысла, вы можете даже рассмотреть вопрос об объявлении его в качестве чистого виртуального:

virtual int area() = 0; 
1

Ваш код имеет несколько ошибок и в результате код не имеет смысла.

Рассмотрим, например, конструктор

Triangle(int a=0, int b=0) 
    { 
    Shape(a, b); 
    } 

Ar первый конструктор по умолчанию Shape будет называться, потому что вы не указали вызов конструктора Shape в списке инициализации т е р. Таким образом, ширина и высота будут установлены в ноль конструктором по умолчанию. Внутри тела конструктора Треугольника вы просто создаете временный объект типа Shape, который будет использоваться никогда.

Это может Взглянуть на dollowing стороннюю

Triangle(int a=0, int b=0) : Shape(a, b) {} 

или даже

explicit Triangle(int a=0, int b=0) : Shape(a, b) {} 

, если вы знаете, что явные средства.

Помимо этого, иерархия классов должна основываться на виртуальных функциях, которые могли бы получить эффект полиморфизма. Таким образом, класс Shape должен быть определен следующим образом:

class Shape { 
    protected: 
     int width, height; 
    public: 
     Shape(int a=0, int b=0) : width(a), height(b) {} 

     virtual ~Shape() {} 

     virtual int area() const = 0; 
}; 

     int Shape::area() const 
     { 
     cout << "Parent class area :" <<endl; 
     return 0; 
     } 

Нудировать производные классы в соответствии с этими изменениями.

Смежные вопросы