避免强制转换以访问派生类的专用成员
Avoid casting to access specialized member of a derived class
在我们的代码中,我们有一个物理问题(待解决),它封装了一个介质(例如流体或固体)。
一个问题可以是几种类型(热传导、湍流等),它们都来自一个基类,并因此封装了不同性质的介质(例如,"湍流"类型的问题在流体上求解)。所有媒体都继承自抽象基类。
处理继承(问题/介质)和封装的优雅方法是什么?值得注意的是,我是否可以避免每次需要在派生问题中访问派生介质类的特定功能时重复使用静态转换?
代码的简化说明版本:
class ProblemAbstract
{
public:
virtual void solve() = 0;
...
protected:
MediumAbstract * med;
};
class ProblemTurbulent: public ProblemAbstract
{
// ProblemTurbulent is always built with a MediumFluid
...
virtual void solve()
{
// Can I avoid this?
MediumFluid * med_f = static_cast<MediumFluid>(med); // MediumFluid derives from MediumAbstract
med_s->someSpecificFluidMethod();
}
};
我认为这个小模板不会伤害任何人,即使是没有经验的程序员
class ProblemAbstract
{
public:
virtual void solve() = 0;
...
protected:
MediumAbstract * med;
};
template <typename MediumTypeT>
class ProblemHelper :
public ProblemAbstract
{
protected:
MediumTypeT getMedium()
{
return dynamic_cast<MediumTypeT *>(med);
}
};
class ProblemTurbulent :
public ProblemHelper<MediumFluid>
{
// ProblemTurbulent is always built with a MediumFluid
...
virtual void solve()
{
getMedium()->someSpecificFluidMethod();
}
};
相关文章:
- .cpp和.h文件中的模板专用化声明
- 模板专用化与派生类不匹配
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- 选择专用于派生实例的基类的类模板
- 在两个派生类之间执行专用代码
- 具有公共基础的派生类的模板专用化
- 类是否可以包含基类作为成员,该基类稍后专用于派生类
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- 派生类中的部分专用化(加上奇怪的循环模式)
- 专用化模板化派生类的成员函数
- 模板部分专用化阻止从派生类进行初始化
- 避免强制转换以访问派生类的专用成员
- 将派生类传递给专用于基类的模板函数
- 从派生类实现基类构造函数专用化的替代方法是什么
- 未为派生类型调用函数模板专用化
- 将专用基指针强制转换为专用于其他模板参数的派生指针("adding on"专用化)
- 在派生类模板中专用基类的成员函数
- 是否可以派生自和"respecialize"具有派生自专用类型的类型的专用类?
- 在派生类中专用化基的模板化成员函数
- C++中的模板专用化和派生类