防止派生类强制转换为基类
Prevent derived class from casting to base
我有
class Rect{
// stuff
};
和
class SpecialRect:public Rect{
private:
operator const Rect(){return *this;} // No implicits casts to Rect
public:
// stuff
};
SpecialRect继承了Rect的所有属性和方法,除了我想避免SpecialRect到基类Rect的非显式转换。
在代码中
SpecialRect oneSpecial;
Rect aRect=oneSpecial; // I want this to not compile. (to remind-me to declare aRect as SpecialTect)
编译时没有错误。(我知道将基类Rect声明为private可以做到这一点,但我不想重新实现它的所有方法。)
有办法做到这一点吗?
在Rect中声明SpecialRect的私有复制构造函数可以做到这一点,但有一个缺点:Rect取决于SpecialRect声明。【来自Jarod42的评论】
注意:请记住,您需要实现空构造函数,因为不会有默认构造函数。
class SpecialRect;
class Rect {
public:
Rect(){}
private:
Rect(const SpecialRect&);
//Rect(const SpecialRect&) = delete; // c++11
};
class SpecialRect : public Rect {
};
int main()
{
SpecialRect sr;
//Rect r1 = sr; // error: 'Rect::Rect(const SpecialRect&)' is private
//Rect r2(sr); // error: 'Rect::Rect(const SpecialRect&)' is private
Rect r3;
Rect r4(r3);
Rect r5 = r3;
return 0;
}
另一种解决方案是在Rect中声明显式默认复制构造函数。这样做的好处是不依赖于子类,但也有副作用。
class Rect {
public:
Rect(){}
explicit Rect(const Rect&);
};
class SpecialRect : public Rect {
};
int main()
{
SpecialRect sr;
//Rect r1 = sr; // Prevents this
Rect r2(sr); // Leaves this
Rect r3;
Rect r4(r3);
//Rect r5 = r3; // Side Effect: Prevents this
return 0;
}
相关文章:
- 从基类实例调用派生类方法而不进行强制转换
- C++将派生类转换为基类时'object slicing'期间发生的情况
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 调用不在基类中的派生类函数而不进行动态强制转换,以最大程度地提高性能
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?
- 从未使用过到基类的转换
- 基类到派生类的强制转换向量
- 有没有办法复制派生类指针的向量而不将其强制转换为基类?
- 为什么此代码不将基类强制转换为 c++ 中的派生类?
- 如何在运行时将指向派生类的 void* 正确转换为指向基类的 void*
- 从基类的共享指针向下转换到派生类的引用
- 为了访问方法,从基类动态转换为派生类
- 派生类 插入和提取运算符重载以及基类与派生类之间的强制转换
- 将空基类优化对象强制转换为另一种类型是否会破坏严格的别名?
- 基类到派生模板类的强制转换指针,而不知道类型
- 带有基类指针的强制转换向量,指向子类
- 通过转换基类指针来设置派生类字段
- 强制转换基类问题
- 强制转换基类保护方法的返回指针的替代方法