Наследование и чисто виртуальная функция в с ++

Я не получаю желаемый результат с этой программой. Предупреждения, которые я получаю:

  1. Класс 'shape' имеет виртуальный метод 'shap', но не виртуальный деструктор.
  2. У lass 'square' есть виртуальный метод 'shap', но не виртуальный деструктор.
  3. Класс 'rectangle' имеет виртуальный метод 'shap', но не виртуальный деструктор.

Хотя программа компилируется без каких-либо ошибок, но я не получаю ответы, которые должны быть 20 и 18. Также я не могу понять значение этих предупреждений. И почему ответы не отображаются на экране? А также как я должен инициализировать значения длины и ширины, если я должен был сделать это через конструктор.

#include <iostream>
using namespace std;

class shape {
    int length;
    int breadth;

public:
    int area;
    virtual int shap(int, int) = 0;
};

class square : public shape {
public:
    int shap(int length, int breadth) { return area = length * breadth; }
};

class rectangle : public shape {
public:
    int shap(int length, int breadth) { return area = length * breadth; }
};

int main() {
    shape* s;
    square sq;
    rectangle rect;

    s = &sq;
    s->shap(4, 5);

    s = &rect;
    s->shap(6, 3);
    return 0;
}

1 ответ

Решение

Я не получаю желаемый результат с этой программой. Предупреждения, которые я получаю:

Class 'shape' has virtual method 'shap' but non-virtual destructor.
lass 'square' has virtual method 'shap' but non-virtual destructor.
Class 'rectangle' has virtual method 'shap' but non-virtual destructor.

Чтобы очистить предупреждения, это в точности как то, что говорится в предупреждениях.

добавить в соответствующие классы их деструктор.

virtual ~shape();
virtual ~rectangle()
virtual ~square();

также для rectangle:: shap и square:: shap, добавьте виртуальный перед ним.

Другие вопросы по тегам