【发布时间】:2021-01-22 21:43:08
【问题描述】:
感谢您花时间查看我的问题。我正在尝试在 C++ 中实现双重调度,但它似乎没有采取。我想我可能缺少一些东西?我不相信对象切片是我使用指针的问题。我已经阅读了有关重载解决方案的问题,并且双重调度是一种解决方法。任何帮助表示赞赏。
这是我的代码
class ReactType;
class ConditionerBase
{
public:
ConditionerBase(/* args */){};
~ConditionerBase(){};
virtual void visit(ReactType* reactor);
};
class ReactType
{
public:
ReactType(/* args */){};
~ReactType(){};
virtual void accept(ConditionerBase *conditioner);
};
class IdealReactType: public ReactType
{
public:
IdealReactType(/* args */){};
~IdealReactType(){};
virtual void accept(ConditionerBase *conditioner);
};
class Conditioner : public ConditionerBase
{
public:
Conditioner(/* args */){};
~Conditioner(){};
virtual void visit(ReactType* reactor){std::cout<<"Visited unknown reactor"<<std::endl;};
virtual void visit(IdealReactType* ideal_reactor){std::cout<<"Visited ideal_reactor"<<std::endl;};
};
void ReactType::accept(ConditionerBase *conditioner){conditioner->visit(this);};
void IdealReactType::accept(ConditionerBase *conditioner){conditioner->visit(this);};
void ConditionerBase::visit(ReactType* reactor){std::cout<<"Base"<<std::endl;};
void doubleDispatchExample()
{
std::vector<ReactType*> reactors;
ReactType* unknown = new ReactType();
IdealReactType* ideal_reactor = new IdealReactType();
reactors.push_back(unknown);
reactors.push_back(ideal_reactor);
Conditioner conditioner;
for (size_t i = 0; i < 2; i++)
{
reactors.at(i)->accept(&conditioner);
}
delete unknown;
delete ideal_reactor;
}
我希望输出是
Visited unknown reactor
Visited ideal reactor
但我得到了
Base
Base
拨打doubleDispatchExample()时
有人建议我将函数设为虚拟,这给了我
Visited unknown reactor
Visited unknown reactor
【问题讨论】:
-
使函数
visit和accept虚拟化。 -
@Eugene 使它们成为虚拟然后给我一个
Visited unknown reactor Visited unknown reactor的输出,这仍然不是我想要的。 -
@Eugene,这条评论让我找到了答案。谢谢!
-
如果您在希望重载虚函数的函数上添加
overload,这将大有帮助。 -
上面的错字。
override,而不是overload。接受建议。可以节省大量调试。
标签: c++ oop overloading