c++ - 避免强制转换以访问派生类的专门成员

标签 c++ oop inheritance encapsulation

在我们的代码中,我们有一个封装介质(例如流体或固体)的物理问题(待解决)。

一个问题可以有多种类型(热传导、湍流……),所有类型都派生自基类,因此封装了不同性质的介质(例如,“湍流”类型的问题在流体上得到解决).所有媒体都继承自一个抽象基类。

同时处理继承(问题/媒介)和封装的优雅方式是什么?值得注意的是,每当我需要在派生问题中访问派生媒体类的特定功能时,我能否避免重复使用静态转换

代码的简化说明版本:

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();
  }
};

关于c++ - 避免强制转换以访问派生类的专门成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36032331/

相关文章:

C++:当不是所有的派生类都预先知道时使用继承?

c++ - Eigen 中的转换运算符

Android native 应用程序命令行参数

Javascript 使用变量继承构造函数

c++ - malloc.c :3097: sYSMALLOc: Assertion fails inside constructor of dynamically created object

Java - 方法实现依赖于参数值

java - Java中是否可以从其父类(super class)调用子类的实例变量?

c++ - 使用可变参数模板构建函数参数

c++ - 制作复合 std::function

c++ - 使用虚拟重写基类方法不起作用