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)
component为引用类型- AComponent&(或&component到AComponent*).你不想复制任何东西.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,但第一点仍然成立.