自从我使用C ++继承以来已经有一段时间了,我想知道是否有人可以向我阐明和解释一些东西:

class parent {
  public:
    int count;
    parent() : count(0) {}
    void increase_count() {count++;}
    void print_count() {printf("Count: %d\n", count);}
};

class child : public parent {
  private:
    int other;
  public:
    child() : other(0) {}
};

int main (int argc, char *argv[]) {

  child c;
  for (int i = 0; i < 5; i++) {
    c.print_count();
    c.increase_count();
  }

  for (int i = 0; i < 5; i++) {
    c.parent::print_count();
    c.parent::increase_count();
  }
}


看来c.<parent_function>()c.parent::<parent_function>()是相同的。该语法仅存在于多重继承吗?还是有些细微之处,即使没有多重继承,parent::范围说明符也会有所不同?

编辑:道歉,但我还打算规定孩子不要使用同名的方法。

最佳答案

看起来c。()和c.parent::()是相同的。


仅当child没有相同名称的功能时,它们才是相同的。


  该语法仅存在于多重继承吗?


否。有时候您需要在父类中调用函数的实现。


  还是有些细微之处,即使没有多重继承,parent ::范围说明符也会有所不同?


是。

例:

#include <iostream>

class parent {
   public:
      virtual void print() const
      {
         std::cout << "In parent::print()\n";
      }

};

class child : public parent {
   public:
      virtual void print() const
      {
         std::cout << "In child::print()\n";
      }
};

void print(parent& p)
{
   p.print(); // Goes to child::print() when p references a child
   p.parent::print(); // Goes to parent::print() regardless
}

int main()
{
   child c;
   print(c);
}


输出量

In child::print()
In parent::print()


另外,有时您需要从子级的实现中调用virtual成员函数的父级实现。

例:

#include <iostream>

class parent {
   public:
      virtual void save(std::ostream& out) const
      {
         // Save the data corresponding to this class.
      }

};

class child : public parent {
   public:
      virtual void save(std::ostream& out) const
      {
         // Save the data corresponding to parent first.
         parent::save(out);

         // Save the data corresponding to this class.
      }
};

void save(parent& p, std::ostream& out)
{
   p.save(std::cout); // Calls child::save() when p references a child,
                      // which in turn calls parent::save()
}

int main()
{
   child c;
   save(c, std::cout);
}

10-08 00:19