C++ 对超类的引用
我希望将访问者模式与智能指针结合使用,但编译器似乎无法检测子类并匹配适当的函数 我已经写了一个SSCE来说明这个问题: test.hpp:C++ 对超类的引用,c++,C++,我希望将访问者模式与智能指针结合使用,但编译器似乎无法检测子类并匹配适当的函数 我已经写了一个SSCE来说明这个问题: test.hpp: class Visitor; class Area { public: virtual void visit(const Visitor& visitor) = 0; }; class Area1 : public Area { public: virtual void visit(const Visitor& visito
class Visitor;
class Area {
public:
virtual void visit(const Visitor& visitor) = 0;
};
class Area1 : public Area {
public:
virtual void visit(const Visitor& visitor);
};
class Area2 : public Area {
public:
virtual void visit(const Visitor& visitor);
};
class Visitor {
public:
virtual void visit(const Area1 &area) const = 0;
virtual void visit(const Area2 &area) const = 0;
};
test.cpp:
#include "test.hpp"
void Area1::visit(const Visitor& visitor) {
visitor.visit(*this);
}
void Area2::visit(const Visitor& visitor) {
visitor.visit(*this);
}
main.cpp
#include <iostream>
#include "boost/shared_ptr.hpp"
#include "test.hpp"
class FooVisitor : public Visitor {
virtual void visit(const Area1 &area) const {
std::cout <<"visit area1" <<std::endl;
};
virtual void visit(const Area2 &area) const {
std::cout <<"visit area2" <<std::endl;
}
};
int main(int argc, char** argv) {
boost::shared_ptr<Area> p(new Area2);
FooVisitor visitor;
visitor.visit(*p);
return 0;
}
我如何帮助编译器认识到应该调用visit(const Area 2&),而不必尝试对每个子类型进行动态转换?这不可行,因为
*p
的类型确实是区域&
(基于指针的类型)。然而,你用错了。要正确应用访问者模式,应调用区域中定义的visit()
,以获得正确的分派:
int main(int argc, char** argv) {
boost::shared_ptr<Area> p(new Area2);
FooVisitor visitor;
p->visit(visitor);
return 0;
}
int main(int argc,char**argv){
boost::共享ptr p(新区域2);
食客;
p->参观(访客);
返回0;
}
这就是Area::visit()
函数的初衷。您的访问者类有两个访问(…)方法:
无效访问(施工区1和施工区)
无效访问(2区和2区)
因此,要从访问者对象显式调用visit方法,需要传递指向Area1对象或Area2对象的引用/指针由于您传递了一个区域对象,因此需要执行动态\u强制转换才能使其工作。
但是您得到的上一个答案总结了代码中的实际问题->您用错了
Area *p = new Area2();
FooVisitor v;
p->visit(v);
这样可以利用代码中的多态性。访问者访问时,我将调用区域类accept
中的visit
函数。
Area *p = new Area2();
FooVisitor v;
p->visit(v);