Унаследованный метод не меняет значения переменных - PullRequest
0 голосов
/ 21 июня 2019

Унаследованный метод init () не работает в новом классе. Значения A, B, C, D остаются неизменными, поэтому переопределенный метод square () также не работает.

Попытка вывести A, B, C, D в открытый доступ, поскольку в большинстве примеров в Интернете есть переменные.

Методы Четырёхугольника работают по назначению. Но «класс Quadrangle подчеркивается IDE:« это объявление не имеет класса хранения или спецификатора типа ». Хотя программа не падает.

Кроме того, правильно ли я переопределяю функцию square ()?

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

using namespace std;

struct point {
    float x, y;
};

class Quadrangle
{
public:
    void init() // sets coordinates for A, B, C, D
    {
        cout << "Input A coordinates (x, y): ";
        cin >> A.x >> A.y;
        cout << "Input B coordinates (x, y): ";
        cin >> B.x >> B.y;
        cout << "Input C coordinates (x, y): ";
        cin >> C.x >> C.y;
        cout << "Input D coordinates (x, y): ";
        cin >> D.x >> D.y;
    };

    void square()
    {
        // square calculation
    };

private:
    point A, B, C, D;
};

class Rectangle : public Quadrangle
{
public:
    void square()
    {
        // square calculation
    };

private:
    point A, B, C, D;
};

Английский не первый, и у меня нет опыта говорить о программировании. Извините, если что-то не так.

Ответы [ 4 ]

4 голосов
/ 21 июня 2019

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

И помните: если у класса есть какой-либо виртуальный метод, убедитесь, что деструктор также виртуален:

virtual ~Quadrangle() = default;
virtual void init();
virtual void square();
4 голосов
/ 21 июня 2019

Прежде всего, если вы хотите получить доступ к членам класса от потомков, вам нужно использовать ключевое слово protected вместо private.

Во-вторых, вам не нужно объявлять те же переменные впотомки.

В вашем случае вы объявили 2 набора переменных с одинаковыми именами, которые доступны только из соответствующих классов.

3 голосов
/ 21 июня 2019

Проблема в том, что Rectangle определяет другую копию каждой из ваших переменных-членов:

class Quadrangle
{
    ...
    point A, B, C, D;
};

class Rectangle : public Quadrangle
{
    ...
    point A, B, C, D;
};

Естественно, методы Quadrangle access Quadrangle::A, Quadrangle::B и т. Д., В то время какметоды Rectangle access Rectangle::A, Rectangle::B и т. д., совершенно отдельный набор переменных.

Вместо этого вы должны определять свои переменные только в Quadrangle и отмечать их protected (так что Rectangle может получить к ним доступ):

class Quadrangle
{
    ...
    protected:
    point A, B, C, D;
};

class Rectangle : public Quadrangle
{
    ...
    // no variables
};
2 голосов
/ 21 июня 2019

Для решения второй части вашего вопроса: Чтобы переопределить в смысле полиморфизма, вам нужно объявить обе квадратные функции как виртуальные.

...