尝试使用继承但无法访问父类
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 modifiers
或access specifiers
.(https://en.cppreference.com/w/cpp/language/access)(这些词例如public
、private
或protected
)。你可以找到[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;
或者,或者,在Student
的public
部分声明printStudent();
。事实上,如果你声明的东西没有任何规范,在class
中,默认为private
,而在struct
中,默认为public
。
【讨论】:
以上是关于尝试使用继承但无法访问父类的主要内容,如果未能解决你的问题,请参考以下文章