受保护的方法在c ++中继承时可以成为私有方法吗? [重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

我一直在玩继承,我尝试过这段代码:

#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:
    void doSum() const
    {
        std::cout << "hi, i'm doing something" << std::endl;
    }

而且代码恰好相同......

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

c++ oop polymorphism private protected
2个回答
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
         //===========================
      }
};

我甚至被允许这样做吗?

是。


1
投票

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

不,没有区别。遗憾的是,C ++标准并未对派生类强加任何要求,以将重写虚函数置于任何特定的可访问范围内。这意味着,基类可以声明受保护的虚方法,并且派生类可以在public / protected / private范围中实现该方法,并且代码仍然是合法的并且将起作用。

© www.soinside.com 2019 - 2024. All rights reserved.