受保护的阶级基础

时间:2014-03-07 22:18:47

标签: c++ class oop

在第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;
}

3 个答案:

答案 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++),因此无法从外部访问它们。

我不知道保护继承的任何用例,恕我直言,它只是出于完整性原因而存在。