Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对超类的引用_C++ - Fatal编程技术网

C++ 对超类的引用

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

我希望将访问者模式与智能指针结合使用,但编译器似乎无法检测子类并匹配适当的函数

我已经写了一个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& 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);