尝试使用继承但无法访问父类

Posted

技术标签:

【中文标题】尝试使用继承但无法访问父类【英文标题】: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 永远不会为空,因此测试毫无意义。 【参考方案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

【讨论】:

以上是关于尝试使用继承但无法访问父类的主要内容,如果未能解决你的问题,请参考以下文章

Java中子类能够继承父类的private属性或方法吗

无法在构造函数中访问类的继承成员

包和访问权限3

Jave 类的继承

子类从父类继承过来的方法可以操作子类自己定义的成员变量吗

Java继承和组合