C++中的简单继承

xbo*_*nez 7 c++

我正在为即将进行的测试查看一些示例问题,这个问题让我很困惑.

请考虑以下代码:

class GraduateStudent : public Student 
{
  ...
};
Run Code Online (Sandbox Code Playgroud)

如果省略"public"这个词,则GraduateStudent使用私有继承,这意味着下列哪一项?

  1. GraduateStudent对象可能不使用的方法Student.

  2. GraduateStudent无法访问私有对象Student.

  3. 没有方法GraduateStudent可以调用方法Student.

  4. 只有const方法GraduateStudent可以调用方法Student.

Tyl*_*nry 22

虽然这是一个简单的家庭作业问题,但我会回答它,因为这是一个可怕的问题.我几乎认为这是一个棘手的问题,而且它并没有真正对知识进行良好的测试.

答案是2. GraduateStudent无法访问Student的私人对象.除了这与私有继承没有任何关系.无论public关键字是否存在,第2点都是正确的,因为派生类永远不能访问其基类的私有成员,无论它们如何继承.

私有继承本质上意味着两件事(而不是公共继承):

  1. 所有公共方法Student成为私人方法GraduateStudent.这意味着,例如,如果Student有一个公共方法foo(),那么GraduateStudent有一个私有方法foo().

  2. 基类是"不可访问的",这意味着多态不起作用.通俗地说,这意味着如果GraduateStudent私下继承Student,那么你就不能把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;
};
Run Code Online (Sandbox Code Playgroud)