受保护的方法在 c++ 中继承时可以成为私有方法

A protected method can become a private method when inherited in c++?

本文关键字:有方法 继承 方法 c++ 受保护      更新时间:2023-10-16

我一直在玩继承,我尝试了以下代码:

#include <iostream> 
#include <string>
class Foo
{
public:
    virtual void func() = 0;
protected:
    virtual void doSum() const = 0;
};
class Bar : public Foo
{
public:
    void func() { 
        doSum();
    }
protected:
    void doSum() const
    {
        std::cout << "hi, i'm doing something" << std::endl;
    }
};
int main() 
{ 
    Foo* ptr = new Bar();
    ptr->func();
   return 0; 
}

所以我也尝试将class Bar中的 protected 关键字替换为 private 像这样:

private:
    void doSum() const
    {
        std::cout << "hi, i'm doing something" << std::endl;
    }

而且代码碰巧工作得一样...

所以我的问题是,如果我在实现派生类时声明受保护的方法私有,有什么区别吗?如果是这样,它们是什么?我甚至可以这样做吗?

所以我的问题是,如果我在实现派生类时声明受保护的方法私有,有什么区别吗?

是的。

如果是这样,它们是什么?

这将阻止下一级派生类能够调用派生类的实现。

class Foo
{
   protected:
      virtual void doSum() const = 0;
};
class Bar : public Foo
{
   private:
      void doSum() const
      {
         std::cout << "hi, i'm doing something" << std::endl;
      }
};
class Baz : public Bar
{
   public:
      void doSum() const
      {
         //===========================
         Bar::doSum(); // NOT ALLOWED
         //===========================
      }
};

我甚至可以这样做吗?

是的。

所以我的问题是,如果我在实现派生类时声明受保护的方法私有,有什么区别吗?

不。没有区别。遗憾的是,C++标准并没有对派生类施加任何要求,以将覆盖虚函数放置在任何特定的可访问性范围内。这意味着,基类可以声明一个受保护的虚拟方法,派生类可以在公共/受保护/私有范围内实现该方法,并且代码仍然是合法的并且可以工作。