绕过错误C2248"的有效方法无法访问类#34中声明的受保护成员;

时间:2017-04-24 12:47:36

标签: c++ protected derived-class poco-libraries

我正在实施一个c ++应用程序,其中我还使用了Poco库。特别是我试图使用poco日志框架。我创建了一个类,它使用poco示例中的以下代码来创建日志记录机制:

 AutoPtr<PatternFormatter> pPatternFormatter(new PatternFormatter());
 AutoPtr<FormattingChannel>pFormattingChannel(new 
 FormattingChannel(pPatternFormatter));

 pPatternFormatter->setProperty("pattern", "%s: %p : %t");

 AutoPtr<ConsoleChannel> pConsoleChannel(new ConsoleChannel());
 pFormattingChannel->setChannel(pConsoleChannel);

然而,当我尝试用poco SharedPtr指针替换poco AutoPtr时 我收到以下构建错误:

错误C2248&#39; Poco :: FileChannel :: ~FileChannel&#39;:无法访问在课程中声明的受保护成员&#39; Poco :: FileChannel&#39;

我搜索过并发现FileChannel类的析构函数受到保护,我假设它是为了防止通过指向其基础的指针删除对象。 使用公共或受保护的访问说明符从FileChannel派生我的类以使SharedPtr工作还是以其他方式工作是否有效?

1 个答案:

答案 0 :(得分:1)

出于好奇,我想到:如果派生类使析构函数公开,该怎么办?实际上,这听起来太容易了,但我相信它应该有效。

示例test-prot-dtor.cc

#include <iostream>

class Base {

  public:
    Base() { std::cout << "Base::Base()" << std::endl; }
  protected:
    virtual ~Base() { std::cout << "Base::~Base()" << std::endl; }
};

class Derived: public Base {

  public:
    Derived() { std::cout << "Derived::Derived()" << std::endl; }
    virtual ~Derived() { std::cout << "Derived::~Derived()" << std::endl; }
};

int main()
{
#if 0 // Does not work!
  Base *pBase = new Derived;
  delete pBase;
  /* here:
   * error: 'virtual Base::~Base()' is protected
   */
#endif // 0
  Derived *pDerived = new Derived;
  delete pDerived;
  // done
  return 0;
}

使用VisualStudio 2013(Express)和Windows 10(64位)上的cygwin中的gcc进行测试。下面是与后者的示例会话:

$ g++ --version
g++ (GCC) 5.4.0

$ g++ -std=c++11 -c test-prot-dtor.cc

$ ./test-prot-dtor     
Base::Base()
Derived::Derived()
Derived::~Derived()
Base::~Base()

$

关于你的想法(让SharedPtr成为派生类的朋友)我不确定。它取决于SharedPtr的实现细节,即它是“自己完成工作”还是将它委托给另一个(最终甚至是隐藏的)类/方法或函数......