【问题标题】:Why is my the second class not inheriting and modifying a method properly?为什么我的第二个类没有正确继承和修改方法?
【发布时间】:2022-01-15 21:27:57
【问题描述】:

在第二个类中,我只想将数字添加到字符串中,我收到错误“main.cpp:38:19: error: ‘virtual void NumericInput::add(char)’ is private in this context 38 |输入->添加('1');'每次我为 Numeric 对象添加类。我在这里做错了什么,不是所有的东西都已经公开了吗?谢谢!!

#include <string>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
using namespace std;

class TextInput
{
    public:
    string s="";
    
    virtual void add(char c)
    {
        s+=c;
    }
    string getValue()
    {
        return s;
    }
};



class NumericInput : public TextInput
{
    //modified
    void add(char c) 
    {
        if(isdigit(c))
        {
            s+=c;
        }
    }
};

int main()
{
    NumericInput* input = new  NumericInput();
    input->add('1');
    input->add('a');
    input->add('0');
    cout<<input->getValue();
}

【问题讨论】:

  • 要么将您的NumericInput 设为结构体,要么将您的方法公开
  • “不是所有的东西都已经公开了吗?” 关键字class 使每个成员private 除非另有明确说明。如果您改为使用struct,则成员将默认为publicC/C++ Struct vs Class
  • 顺便说一句,std::sting 类初始化为空字符串;所以你不需要。

标签: c++ class object polymorphism


【解决方案1】:

如果没有公共访问说明符,则默认情况下类中的所有声明都是私有的。您还应该在 NumericInput 中覆盖您的虚函数。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

在 NumericInput 中添加 public 之前

class NumericInput : public TextInput
{
public:
    //modified
    void add(char c) 
    {
        if(isdigit(c))
        {
            s+=c;
        }
    }
};

【讨论】:

  • 嘿!如果您解释了它的作用,那对 Stella(和未来的读者)将非常有帮助!
  • 非常感谢!!!!为了将来参考,我是否必须将所有类公开才能像这样在 main 中调用它们的方法?
  • 是的。我实际上总是使用struct。随着时间的推移,额外的public: 行会妨碍您。 struct 和 class 之间的唯一区别正是默认范围。
  • @Stella 您不必公开所有课程,总是使用struct 是个坏主意。 可见性(由public:protected:private: 控制)是保持代码可维护性的重要工具:通过控制类内部的哪些部分对其用户及其子项可见,您可以设置 API 是什么,这在更改程序的一个部分而无需更改所有其他部分时非常重要(因为当可见部分中没有任何变化时,您不会'不必改变任何使用它的东西)。请不要只使用struct
  • @Jellyboy 这就是为什么,当您查看任何超过少数类的优秀 C++ 代码语料库时,开发人员会尽量减少 public(和 structs通常仅在您需要将类用作纯数据容器而无需继承时才使用)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多