繁体   English   中英

模板 class 派生自私有成员 class 破坏封装

[英]Template class derived from private member class breaks encapsulation

我发现打破 class 中派生的 class 封装似乎是一种奇怪的方法

采取以下

class Base
{
    private:
        class Member
        {
            public:
                virtual ~Member() {}

                virtual void Function() = 0;
         };
};

如果您尝试从这个私有 class 派生

class DerivedMember : public Base::Member
{
    public:
        DerivedMember() {}

        virtual void Function() {/*Do something*/}
};

你得到一个编译错误

error: 'class Base::Member' is private
error: within this context

但是,如果您从中派生模板

template <typename T>
class TemplateDerivedMember : public Base::Member
{
    public:
        TemplateDerivedMember () {}

        virtual void Function() {/*Do something*/}
};

然后编译器将接受它,并允许这种情况发生。

我已经针对 GCC 8.1 和 GCC 4.6 对此进行了测试,并且两者都具有相同的行为。 这是一个错误,还是应该允许的? 将它作为模板派生 class 是否隐含地将TemplateDerivedMember class 作为Base的成员? (它似乎无法在全局命名空间中访问)

是的,这是一个错误,显然自 GCC 11 以来已修复。据我所知,Clang 和 MSVC 总是拒绝该代码。 演示: https://gcc.godbolt.org/z/9evfYq5hc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM