为什么在静态转换后调用构造函数?

Dim*_*lov -1 c++ polymorphism dynamic-cast static-cast

这是我的班级:

class AComponent : public nts::IComponent
{
public:
  AComponent(const size_t &maxInputs, const size_t &maxOutputs, const size_t &value);
  AComponent(nts::AComponent &);
  virtual ~AComponent();
  virtual nts::Tristate Compute(size_t pin_num_this = 1);
  virtual void SetLink(size_t pin_num_this,
     nts::IComponent &component,
     size_t pin_num_target);
  void setComponent(const size_t &components, nts::Tristate &state);
  virtual void Dump(void) const;
  nts::Tristate &getComponent(const size_t &pin);
protected:
  std::vector <nts::Tristate *>   _components;
  size_t                        _maxInputs;
  size_t                        _maxOutputs;
};
Run Code Online (Sandbox Code Playgroud)

当我尝试拨打这一行时:

this->_components[pin_num_this] =
    &static_cast<nts::AComponent>(component).getComponent(pin_num_target);
Run Code Online (Sandbox Code Playgroud)

我发生了以下编译错误:

sources/AComponant.cpp:33:76: error: no matching function for call to ‘nts::AComponent::AComponent(nts::IComponent&)’
   this->_components[pin_num_this] = &static_cast<nts::AComponent>(component).getComponent(pin_num_target);
Run Code Online (Sandbox Code Playgroud)

如果我实现构造函数,它就在这里.问题是,我不想操纵IComponent,我想操纵AComponent.你知道为什么会这样吗?

编辑:

this->_components是一个向量.它以这种方式在构造函数中声明:

this->_components.reserve(maxInputs + maxOutputs + 2);
Run Code Online (Sandbox Code Playgroud)

Log*_*uff 5

  1. 您将需要转换component为引用类型- AComponent&(或&componentAComponent*).你不想复制任何东西.
  2. 您可能需要安全地dynamic_cast从基类转发到派生类.是没有检查,向上转发的向下转发......好吧,这是列表.static_cast

你应该拥有什么:

dynamic_cast<nts::AComponent&>(component).getComponent(pin_num_target);
Run Code Online (Sandbox Code Playgroud)

阅读如何使用dynamic_cast.有一个运行时检查.转换可能会失败并抛出std::bad_cast(引用类型)或返回nullptr(指针类型).

编辑:如果你有一个抽象IComponent而且只有一个派生类型IComponent,你可以很确定会有一个component会引用一个AComponent对象.因此,你可以这样做static_cast,但第一点仍然成立.