在第16行中,当我使用public
时,它可以工作,但是当我尝试使用protected
基类型时,它会给我一个编译错误。有人可以简单解释一下我。
我假设它是因为基类的受保护成员就像私人成员,但我不确定。
#include <iostream>
#include <string>
using namespace std;
// base class
class College
{
//private:
protected:
string name;
public:
College(string name = "any college")
{ this->name = name; cout << "base College constructor\n"; }
~College() { cout << "base College destructor\n"; }
string getName() const { return name; }
};
// derived class
class CommunityCollege : protected College //(public college it works)
{
private:
string district;
public:
CommunityCollege(string name, string district) : College(name)
{ this->district = district; cout << "derived Community College constructor\n"; }
~CommunityCollege() { cout << "derived Community College destructor\n"; }
string getDistrict() const { return district; }
void printName() const { cout << name << endl; }
};
class FHDA : public CommunityCollege
{
private:
int numStudents;
public:
FHDA(string name, string district, int num) : CommunityCollege (name, district)
{ this->numStudents = num; cout << "derived 2 FHDA constructor\n"; }
~FHDA() { cout << "derived 2 FHDA destructor\n"; }
int getStudentNum() const { return numStudents; }
};
int main()
{
/////////////////////// Part 1: inheritance basics //////////////////////
CommunityCollege da ("foothill", "fhda");
cout << da.getName() << endl;
return 0;
}
答案 0 :(得分:0)
受保护的成员对于不是从该类派生的所有内容起私有作用,但当其他类继承具有受保护成员的类时,可以将其作为公共进行访问。
答案 1 :(得分:0)
这称为受保护的继承。 它只是意味着,受保护的继承是 ONLY 对基类和它的孩子是可见的。从外部世界来看,没有人能够看到CommunityCollege是否来自大学。
如果您希望使用基类中的某些函数,您可以在派生类的公共声明中使用声明:
using College::getName;
答案 2 :(得分:-1)
编译您的示例会出现错误:
main.cpp: In function ‘int main()’:
main.cpp:16:12: error: ‘std::string College::getName() const’ is inaccessible
string getName() const { return name; }
^
main.cpp:50:25: error: within this context
cout << da.getName() << endl;
^
main.cpp:50:25: error: ‘College’ is not an accessible base of ‘CommunityCollege’
您正在尝试调用从基类继承的成员函数getName()。当您使用受保护的继承时,子类中的公共函数将在子类中受到保护(有关详细信息,请参阅Difference between private, public, and protected inheritance in C++),因此无法从外部访问它们。
我不知道保护继承的任何用例,恕我直言,它只是出于完整性原因而存在。