Производная функция не возвращает правильные значения данных

Все еще работающий над программой наследования, базовый класс — это Shape, и есть три производных класса: прямоугольник, круг и квадрат (квадрат получен из 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

Решение

Вы должны сделать свой 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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector