我可以在 C++ 中覆盖字符串返回类型函数吗
Posted
技术标签:
【中文标题】我可以在 C++ 中覆盖字符串返回类型函数吗【英文标题】:Can I override a string return type functions in c++ 【发布时间】:2016-06-26 12:15:24 【问题描述】:我不明白为什么这不能编译:
#include<iostream>
#include<string>
using namespace std;
class Product
public:
virtual void print() = 0;
virtual void slog() = 0;
virtual void loft() = 0;
;
class Bike: public Product
private:
string s;
public:
Bike(string x)
s = x;
void print()
std::cout << "Bike";
int slog()
return 4;
string loft()
return s;
;
int main()
string s("Hello");
Product *p = new Bike(s);
p->print(); //works fine
cout << p->slog();//works fine
cout << p->loft(); //error
return 0;
-
上述代码导致错误。为什么我不能覆盖字符串类。
我想使用指针
p
调用loft()
。
有没有办法使用指向抽象类Product
的指针对象来实现这一点
【问题讨论】:
您不会覆盖std::string
。请修正您的术语。请显示您在代码中遇到的逐字错误。
请下次,让你的代码更具可读性。从长远来看,这对你来说也会更顺利:)
我会开始查看line 30:7: error: virtual function 'slog' has a different return type ('int') than the function it overrides (which has return type 'void') int slog() ...
并从顶部开始解决错误(通常更有意义,修复第一个错误,然后重新运行,因为“后续错误”的光学噪音来自一个最初的,没有生产力。如果有什么不可修复的,只需复制上述问题中的剩余错误,看看人们是否可以提供进一步的帮助。谢谢。
【参考方案1】:
首先,您需要包含字符串#include <string>
。
【讨论】:
感谢您回复@izzak_pyzaak。但是 s 在 Bike 构造函数中被实例化。我什至尝试了你所说的。问题不在于s。编译器说预期的 int 返回类型代替了字符串。 你加了#include <string>
是的,我添加了字符串标题。编译器说你不能在函数覆盖中返回除 int 或 void 之外的任何返回类型。
他初始化了s
。
是的没看到,让我删除。【参考方案2】:
loft
方法没有问题,print
方法有问题。子类的返回类型为string
,基类的返回类型为void
,因此您并没有真正覆盖该函数。编译器在基类中看到void print()
的声明,您不能在上面执行cout
。
这是您的代码,上面有一些修复和 cmets,它应该可以正常工作。
#include <iostream>
#include <string>
using namespace std;
class Product
public:
virtual void print() = 0;
virtual int slog() = 0;
virtual string loft() = 0;
//added virtual destructor so you can use pointer to base class for child classes correctly
virtual ~Product() ;
;
class Bike: public Product
string s;
public:
Bike(string x)
s = x;
void print()
cout << "Bike";
int slog()
return 4;
string loft()
return s;
;
int main()
string s("Hello");
Product *p = new Bike(s);
p->print();
cout << p->slog();
cout << p->loft();
return 0;
另外,请下次尝试更好地格式化您的代码,这样更容易阅读
【讨论】:
感谢回复@buld0zzr print function return type is void only see I have updated previous code.实际上我们不能在函数覆盖中返回任何返回类型,除了void和int @HrudwikChowdary 现在你的代码编译和运行对我来说很好,只需将虚拟析构函数添加到父类 @HrudwikChowdary 您可能已将错误答案标记为已接受,包括字符串标题并没有真正做任何有用的事情以上是关于我可以在 C++ 中覆盖字符串返回类型函数吗的主要内容,如果未能解决你的问题,请参考以下文章