Я получаю сообщение об ошибке, что только виртуальные функции могут быть помечены как переопределенные - PullRequest
2 голосов
/ 07 мая 2020

Я все время получаю эту ошибку, что только виртуальные функции могут быть помечены как override, но рассматриваемые функции «norm()» и «string to_string()» являются виртуальными. Что может быть причиной этого?

В моей основной функции я также получаю сообщение об ошибке «Нет соответствующей функции-члена» для обратного вызова pu sh, допустил ли я где-то ошибку по пути и просто не вижу ее?

#include <iostream>
#include <cmath>
#include <vector>
using namespace std;

class Group
{
public:
   virtual string to_string() = 0;
   virtual int norm() = 0;
};

class Real 
{
   // add your code here
protected:
   int number;

public:
   Real(int num)
   {
      number = num;
   }
   int norm() override
   {
      return number;
   }

   string to_string() override 
   {
      return number;
   }

   int getNumber() const
   {
      return number;
   }

   void setNumber(int number)
   {
      Real::number = number;
   }
};

class Complex : public Real 
{
   // add your code here
protected:
   int imaginary;
public:
   Complex(int realNum, int imag) : Real(realNum)
   {}
   int norm() override
   {
      return sqrt(number * number + imaginary * imaginary) + 'i';
   }
   string to_string() override
   {
      return ::to_string(number) + '+' + ::to_string(imaginary) + 'i';
   }
};

class Trinomial : public Complex
{
   // add your code here
protected:
   int third;
public:
   Trinomial(int p1, int p2, int p3) : Complex(p1, p2) {
      third = p3;
   }
   int norm() override {
      return sqrt(number * number + imaginary * imaginary + third * third);
   }
   string to_string() override {
      return ::to_string(number) + "x^2+" + ::to_string(imaginary) + "x+" + ::to_string(third);
   }
};

class Vector : public Group
{
   // add your code here
protected:
   vector<int> v;
public:
   Vector(int num1, int num2, int num3)
   {
      v.push_back(num1);
      v.push_back(num2);
      v.push_back(num3);
   }
   int norm() override
   {
      int squared_sum = 0;
      for (int i = 0; i < v.size(); i++) {
         squared_sum += v[i] * v[i];
      }
      return sqrt(squared_sum);
   }
   string to_string() override
   {
      string str = "[";
      for (int i = 0; i < v.size() - 1; i++) {
         str += ::to_string(v[i]) + " ";
      }
      str += ::to_string(v[v.size() - 1]) + "]";
      return str;
   }
};


int main()
{
   vector<Group*> elements;

   elements.push_back(new Real{ 3 });
   elements.push_back(new Complex{ 3,4 });
   elements.push_back(new Trinomial{ 1,2,3 });
   elements.push_back(new Vector{ 1,2,3 });

   for (auto e : elements) 
   {
      cout << "|" << e->to_string() << "| = " << e->norm() << endl;
   }

   for (auto e : elements)
      delete e;

   return 0;
}

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Здесь есть пара проблем:

  • Класс Real должен быть унаследован от Group, чтобы вы могли override функции. Это причина сообщения об ошибке.
  • Во-вторых, Real::to_string должен возвращать строку в конце. Вы можете преобразовать целое число, используя std::to_string.
  • И последнее, но не менее важное: Group должен иметь виртуальный деструктор для определенного поведения. Подробнее здесь: Когда использовать виртуальные деструкторы?

Короче говоря, вам нужно

#include <string>

class Group
{
public:
   // other code
   virtual ~Group() = default;
};

class Real: public Group  // --> inherited from base
 {
   // other codes
public:
   std::string to_string() override {
      return std::to_string(number);
   }

};

В качестве стороны, пожалуйста, не практикуйтесь с using namespace std;

0 голосов
/ 07 мая 2020

у вашего реального класса нет родителя. поэтому вы не можете переопределить to_string ()

...