2013-05-10 3 views
0

Все еще работая над программой наследования, базовый класс представляет собой форму и есть три производных класса: прямоугольник, круг и квадрат (квадрат получен из Rectangle). Когда я устанавливаю значения данных через соответствующие конструкторы, я получаю ложные значения для членов данных каждого производного класса, когда я их показываю. Я либо не устанавливаю их правильно (думаю), либо я не показываю их правильно. Вот фрагмент кода.Произвольная функция, не возвращающая правильные значения данных

class Shape 
{ 
    public: 
    Shape(double w = 0, double h = 0, double r = 0) 
    { 
      width = w; 
      height = h; 
      radius = r; 
    } 

    virtual double area() = 0; 
    void display(); 

    protected: 
    double width; 
    double height; 
    double radius; 
}; 

Один производный класс:

class Rectangle : public Shape 
{ 
    public: 
    Rectangle(double w, double h) : Shape(w, h) 
    { 
    } 

    double area(); 
    void display();  
}; 

функция отображения прямоугольника:

double Rectangle::area() 
{ 
    return width * height; 
} 

Вот мой главный():

#include<iostream> 
#include "ShapeClass.h" 

using namespace std; 

int main() 
{ 
    Rectangle r(3, 2); 
    Circle c(3); 
    Square s(3); 

    c.display(); 
    s.display(); 
    r.display(); 


    system ("pause"); 
    return 0; 
} 

Полная ShapeClass.cpp:

#include<iostream> 
#include "ShapeClass.h" 

using namespace std; 

double Shape::area() 
{ 
    return (width * height); 
} 

double Rectangle::area() 
{ 
    return width * height; 
} 

double Circle::area() 
{ 
    return (3.14159 * radius * radius); 
} 

double Square::area() 
{ 
    return width * width; 
} 

void Square::display() 
{ 
    cout << "Side length of square: " << width << endl; 
    cout << "Area of square: " << this->area() << endl; 
} 

void Circle::display() 
{ 
    cout << "Radius of circle: " << radius << endl; 
    cout << "Area of circle: " << this->area() << endl; 
} 

void Rectangle::display() 
{ 
    cout << "Width of rectangle: " << width << endl; 
    cout << "Height of rectangle: " << height << endl; 
    cout << "Area of rectangle: " << this->area() << endl; 
} 
+0

Что означает ** получение ложных значений **? –

+0

Вы должны быть более конкретными. Вы не указали какой-либо неисправный код и сказали нам, что не так. – 2013-05-10 07:11:22

+0

Это было немного расплывчато: я получаю случайные, очень большие значения - значения мусора, по существу. – user2302335

ответ

0

Вы должны сделать свой area() виртуальная функция в Rectangle, а также:

class Rectangle : public Shape 
{ 
    public: 
    Rectangle(double w, double h) : Shape(w, h) 
    { 
    } 

    virtual double area(); 
    void display();  
}; 

Теперь, также иметь в виду, что если вы хотите, чтобы функция display() быть переопределены в конкретных формах (в вашем примере я видеть, что Rectangle также имеет display() функцию), то вам необходимо сделать его виртуальным, а также, в обоих классах:

virtual void display(); 

Редактировать: Я пробовал следующий код, и он отлично работал. Он основан на вашем коде, поэтому может возникнуть проблема с тем, как вы создали свой проект или как его компилировать/связывать.

#include <iostream> 

using namespace std; 

class Shape 
{ 
    public: 
    Shape(double w = 0, double h = 0, double r = 0) 
    { 
      width = w; 
      height = h; 
      radius = r; 
    } 

    virtual double area() = 0; 
    virtual void display() = 0; 

    protected: 
    double width; 
    double height; 
    double radius; 
}; 

class Rectangle : public Shape 
{ 
    public: 
    Rectangle(double w, double h) : Shape(w, h) 
    { 
    } 

    virtual double area() { return width * height; } 
    virtual void display() 
    { 
     cout << "Width of rectangle: " << width << endl; 
     cout << "Height of rectangle: " << height << endl; 
     cout << "Area of rectangle: " << this->area() << endl; 
    } 
}; 



int main(int argc, char* argv[]) 
{ 
    Rectangle r(3, 2); 

    r.display(); 

    system ("pause"); 

    return 0; 
} 
+0

Все еще возвращая мусор даже после того, как я сделал как функции отображения, так и функции области виртуальными, достаточно интересными. Я создаю прямоугольник: Rectangle r (3, 2); И сообщите об этом для отображения: r.display(); Но он возвращает очень большие числа для моих членов данных (ширина, высота, площадь) – user2302335

+0

делит ваш 'main()' код, пожалуйста, – tbkn23

+0

Я добавил его в свой первоначальный пост. – user2302335

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