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

Why the constructor is called after a static cast?

这是我的 class:

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

当我尝试拨打这条线路时:

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

我遇到了这个编译错误:

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

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

编辑:

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

this->_components.reserve(maxInputs + maxOutputs + 2);
  1. 您需要将 component 转换为引用类型 - AComponent&(或 &component 转换为 AComponent*)。你不想复制任何东西。
  2. 您可能需要 dynamic_cast 才能从基础 class 向下转换为派生 class 安全地static_cast 用于不带检查的向下转型、向上转型和...好吧,here's the list

你应该拥有的:

dynamic_cast<nts::AComponent&>(component).getComponent(pin_num_target);

阅读如何使用 dynamic_cast。涉及运行时检查。转换可能会失败并抛出 std::bad_cast(引用类型)或 return nullptr(指针类型)。

编辑: 如果你有一个抽象 IComponent 并且只有一个类型派生自 IComponent,你可以很确定会有一个 component 将引用一个 AComponent 对象。因此,您可以使用 static_cast 执行此操作,但第一点仍然成立。

1) If a temporary object of type new_type can be declared and initialized with expression, as by new_type Temp(expression);, which may involve implicit conversions, a call to the constructor of new_type or a call to a user-defined conversion operator, then static_cast<type>(expression) computes and returns the value of that temporary object.

http://en.cppreference.com/w/cpp/language/static_cast