我正在实施一个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工作还是以其他方式工作是否有效?
答案 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
的实现细节,即它是“自己完成工作”还是将它委托给另一个(最终甚至是隐藏的)类/方法或函数......