【问题标题】:trying to use inheritance but unable to access parent class尝试使用继承但无法访问父类
【发布时间】:2021-04-02 12:47:53
【问题描述】:

您好,我正在尝试创建一个使用从学生类到研究生类的继承的类,但程序说它无法访问。


    class Student
{
    Student(char* n, int id)
    {
        name = new char[strlen(n) + 1];
        strcpy_s(name,strlen(n)+1, n);
        studentId = id;
    }
    ~Student()
    {
        if (name != NULL)
            delete[]name;
    }
    void printStudent()
    {
        cout << "Student ID: " << studentId << "\nStudent Name: " << name << endl;
    }
protected:
    int studentId;
    char* name;
};
class GraduateStudent :public Student
{
public:
    GraduateStudent(char* n, char* a, int id) : Student(n, id)
    {
        area = new char[strlen(a) + 1];
        strcpy_s(area, strlen(a) + 1, a);
    }
    ~GraduateStudent()
    {
        if (area != NULL)
            delete[]area;
    }
    void printGrad()
    {
        printStudent();
        cout << "Research area: " << area << endl;
    }
private:
    char* area;
};

程序应该打印出一个初始化的graduateStudent类变量,调用printStudent();

【问题讨论】:

  • 您忘记在Student 类的顶部添加public:,默认情况下,类的访问级别是私有的(对于结构,它是公共的,因此您也可以将Student 设为结构)跨度>
  • offtopic:请原谅:name = new char[strlen(n) + 1] 对于任何将阅读此代码的人(您自己)。只需使用std::string
  • 这并不能解决问题,但您不必在删除空指针之前对其进行测试。 delete[]area; 可以正常工作,即使 area 为空。此外,鉴于上面的代码,area 永远不会为空,因此测试毫无意义。

标签: c++ inheritance


【解决方案1】:

类的默认访问是私有的,这使得 OP 的函数是私有的。 因此,您的构造函数是私有的。 你应该阅读this。 另外,this 会回答你的问题吗?

感谢编辑@sweenish

【讨论】:

    【解决方案2】:

    当你创建你的类时,你可以在你的类中定义access modifiersaccess specifiers.(https://en.cppreference.com/w/cpp/language/access)(这些词例如publicprivateprotected)。你可以找到[doc here]

    class myClass{ 
       public:
          // public members go here
       protected:
          // protected members go here
       private:
          // private members go here
    };
    

    为了简单起见,它们允许您判断一个成员是否应该可以从任何地方访问,是否只能从派生类访问,或者根本不能从定义它的类外部访问。当你不放任何东西时,在一个C++类中,它意味着它默认是private

    因此,您的 printStudent() 方法是私有的,无法从您的 GraduateStudent 类访问。

    阅读一些tutorials

    要解决您的编译问题,您应该将Student 构造函数、析构函数和printStudent 设为公开,以允许派生类访问它们并进行编译。

    class Student
    {
     public:
        Student(char* n, int id)
        {
          ...
        }
        ~Student()
        {
          ...
        }
    
        void printStudent()
        {
          ...
        }
    ....
    };
    

    【讨论】:

      【解决方案3】:

      您将int studentId;char* name; 声明为受保护,因此在GraduateStudent 中您可以访问它们,这样您就可以轻松做到:

      void printGrad() {
        cout << "Student ID: " << studentId << "\nStudent Name: " << name << endl;
        cout << "Research area: " << area << endl;
      }
      

      或者,或者,在Studentpublic 部分声明printStudent();。事实上,如果你声明的东西没有任何规范,在class中,默认为private,而在struct中,默认为public

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        • 2015-03-14
        • 2014-11-20
        • 1970-01-01
        相关资源
        最近更新 更多