我可以在 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 &lt;string&gt;

【讨论】:

感谢您回复@izzak_pyzaak。但是 s 在 Bike 构造函数中被实例化。我什至尝试了你所说的。问题不在于s。编译器说预期的 int 返回类型代替了字符串。 你加了#include &lt;string&gt; 是的,我添加了字符串标题。编译器说你不能在函数覆盖中返回除 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++ 中覆盖字符串返回类型函数吗的主要内容,如果未能解决你的问题,请参考以下文章

字符串作为c ++函数中的返回值

C++之重载覆盖和隐藏

C ++:从函数、返回类型或引用中使用和返回字符数组?

C语言中有string吗?

c++中重载,重写,覆盖

C++ lib静态库的接口函数,可以返回一个指针吗?