我收到一条错误消息,说只有虚拟功能可以标记为覆盖

Posted

技术标签:

【中文标题】我收到一条错误消息,说只有虚拟功能可以标记为覆盖【英文标题】:I'm getting an error saying that only virtual functions can be marked as override 【发布时间】:2020-05-07 07:45:17 【问题描述】:

我不断收到这个错误,只有虚拟函数可以标记为override,但有问题的函数“norm()”和“string to_string()”是虚拟的。是什么原因造成的?

在我的主函数中,我也收到错误 no matching member function to call push back,我是不是在某个地方犯了一个错误,我只是没有看到它?

#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;

【问题讨论】:

override 也发现了丢失的继承问题 :-) 【参考方案1】:

这里有几个问题:

Real 类必须继承自Group,这样您才能使用override 函数。这就是错误消息的原因。 其次,Real::to_string 必须在末尾返回一个字符串。你 可能会使用std::to_string 转换整数。 最后但并非最不重要的一点是Group 必须具有用于定义行为的虚拟析构函数。在这里阅读更多:When to use virtual destructors?

总之,你需要

#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;练习

【讨论】:

【参考方案2】:

你的真实班级没有父母。所以你不能覆盖 to_string()

【讨论】:

以上是关于我收到一条错误消息,说只有虚拟功能可以标记为覆盖的主要内容,如果未能解决你的问题,请参考以下文章

无法安装 web3。我收到一条错误消息,说版本不满足要求 rusty-rlp

我收到一条错误消息,内容为“不支持给定路径的格式”。尝试将音频文件上传到共享点时

我应该将所有方法标记为虚拟吗?

无法覆盖UIView.Draw方法

无法加载的android虚拟设备

不支持 Ubuntu 中的 Docker 将文件系统切换到覆盖?