从私有成员类中断封装派生的模板类
Template class derived from private member class breaks encapsulation
我发现了一种奇怪的方法来打破类派生的类的封装
采取以下措施
class Base
{
private:
class Member
{
public:
virtual ~Member() {}
virtual void Function() = 0;
};
};
如果您尝试从此私有类派生
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对此进行了测试,并且两者都具有相同的行为。 这是一个错误,还是应该允许的事情?将其派生为模板类是否会隐式地将TemplateDerivedMember
类作为Base
的成员?(它似乎在全局命名空间中无法访问(
是的,这是一个错误,显然自 GCC 11 以来已修复。据我所知,Clang和MSVC总是拒绝代码。演示:https://gcc.godbolt.org/z/9evfYq5hc
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 如何委托派生类使用其父构造函数?
- 如何使用单独文件中的派生类访问友元函数对象
- 派生类销毁的最佳实践是什么
- 如何使用基类指针引用派生类成员
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 存储模板类型以强制转换回派生<T>
- 需要从 istream 和 ostream 派生 iostream
- 在 C++ 中用派生类型重写成员函数
- 具有多个类、派生类的C++正向声明
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 从私有成员类中断封装派生的模板类
- 将C++封装在C中:派生到基的转换
- 在派生类中提高或降低访问修饰符如何破坏c++封装