我收到一条错误消息,说只有虚拟功能可以标记为覆盖
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