在C ++中继承时,受保护的方法可以成为私有方法吗?

时间:2019-04-08 15:59:48

标签: c++ oop polymorphism private protected

我一直在研究继承,并且尝试了以下代码:

#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; 
}

因此,我还尝试将protected中的class Bar关键字替换为private:

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

和代码碰巧能正常工作...

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

2 个答案:

答案 0 :(得分:1)

  

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

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

答案 1 :(得分:1)

  

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

是的

  

如果是,那是什么?

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

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
         //===========================
      }
};
  

我什至允许这样做吗?

是的