我正在为即将进行的测试准备一些示例性问题,而这个问题使我完全感到困惑。

考虑以下代码:

class GraduateStudent : public Student
{
  ...
};

如果省略了“public”一词,则GraduateStudent使用私有(private)继承,这意味着以下哪一项?
  • GraduateStudent对象不能使用Student的方法。
  • GraduateStudent无权访问Student的私有(private)对象。
  • GraduateStudent的任何方法都不能调用Student的方法。
  • 只有constGraduateStudent方法可以调用Student的方法。
  • 最佳答案

    尽管这是一个纯粹的家庭作业式问题,但我将回答它,因为这是一个可怕的问题。我几乎会认为这是一个棘手的问题,它实际上并不能很好地检验知识。

    答案是2。GraduateStudent无权访问Student的私有(private)对象。 ,除了与私有(private)继承完全无关。无论是否存在public关键字,第2点都是正确的,因为无论它们如何继承,派生类都永远无法访问其基类的私有(private)成员。

    私有(private)继承本质上意味着两件事(与公共(public)继承相反):

  • Student的所有公共(public)方法在GraduateStudent中成为私有(private)方法。这意味着,例如,如果Student具有公共(public)方法foo(),则GraduateStudent具有私有(private)方法foo()
  • 基类是“不可访问的”,这意味着多态性不起作用。用外行的话来说,这意味着,如果GraduateStudentStudent私下继承,那么您就无法将GraduateStudent*视为Student*(或者将GraduateStudent&视为Student&)。

  • 问题的作者也有可能也将第1点当作是正确的答案,但措辞含糊。 “GraduateStudent对象不能使用Student方法”是什么意思?这样做的意图可能是意味着您不能像我在上面的第一点中所写的那样,在Student类型的对象上调用从GraduateStudent继承的方法,但是GraduateStudent对象本身可以在其方法内使用Student的方法。

    例如:
    class Student {
      public:
        void foo() {};
    };
    
    class GraduateStudent : Student {
      public:
       void bar()
       {
         foo(); // Legal
       }
    };
    
    int main() {
      GraduateStudent g;
    
      g.bar(); // Legal
      g.foo(); // Illegal
    
      return 0;
    };
    

    关于c++ - C++中的简单继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2929840/

    10-15 17:53