无法在C ++的派生类中重载基类方法

我想做什么

我正在将使用dynamic_casting来标识派生类(形状)以应用派生类特定处理的现有代码库转换为基于访问者模式的方案。为此,我在基类(虚拟)中添加了processMe方法,并在每个派生类中添加了ShapeShape类的handleShape方法,每种要处理的形状类型(典型的访客模式)都添加了一个handleShape方法。我有一个ShapeProcessor抽象基类,该基类具有一个纯虚拟方法,该方法强制用户提供所有形状处理器,并允许用户从ShapeProcessor派生并根据需要添加其他形状处理方法(例如MyShapeProcessor:public ShapeProcessor)

观察

但是,发现是在MyShapeProcessor中仅针对所有形状调用了catch all方法,而没有调用我的形状特定方法。我需要做些什么才能获得所需的形状特定方法?警告:如果我将所有处理程序方法放在一个类中,它将很好地工作。这是否意味着不可能在基类中重载方法?我已经阅读了有关隐藏姓名的帖子,但似乎不适用于此处。还是呢?我尝试使用“使用”取消隐藏基类方法,但似乎无济于事。

这是伪代码示例:

class Shape {
    virtual void processMe (ShapeProcessor * sp) {
        sp->processShape (*this);
}

// User derived shape
class Circle : public Shape {
    void processMe (ShapeProcessor * sp) {
        sp->processShape (*this);
}

// Base ShapeProcessor
class ShapeProcessor {
    virtual void processShape (Shape& shape) = 0; // User must provide a catch all method
}

// User provided shape processor
class MyShapeProcessor : public ShapeProcessor {
    void processShape (Circle& circle) {
       // Never gets called, even for Circle objects!
    }
    void processShape (Shape& shape) {
       // Always gets called for all shapes!
       cout << "Unsupported shape!" << endl;
    }
}

// User code
Circle * circle = new Circle();
MyShapeProcessor * sp = new MyShapeProcessor();
circle->processMe (sp);  

// Expecting processMe to eventually call MyShapeProcessor processShape (Circle) but calls processShape (Shape)

// Caveat: If I get rid of the ShapeProcessor base class and if I put all shape handles in a single class
// it works fine. Does this mean that it is not possible to overload methods in the base class? I have read
// the posts on name hiding, but that does not seem to apply here. Or does it?
萨胡

您需要添加:

void processShape (Circle& circle);

ShapeProcessor作为virtual成员函数。否则,该功能将无法从任何功能中看到processMe

class ShapeProcessor {
    virtual void processShape (Shape& shape) = 0;

    virtual void processShape (Circle& circle) = 0;

};

在项目中添加的新子类型时Shape,您必须返回ShapeProcessorprocessShape为该子类型添加新功能。

您可以使用模板来避免这种紧密耦合。看看https://stackoverflow.com/a/7877397/434551

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法访问派生类中的基类方法

如果只有C ++中的基类指针,则使用派生类参数重载函数

返回派生类型的基类中的C#方法

指向派生类的基类指针无法访问派生类方法

您能否将派生类添加到其基类的列表中,然后从C#中的基类列表中调用派生类的方法

C ++继承:指向基类的派生类指针调用派生类方法

C ++如何从多个派生类调用基类方法?

C#基类方法返回派生类

C ++:在派生类成员上调用基类方法

C ++替换派生类中的基类

C ++:使用基类中的仅派生类变量

嵌套在基类中的派生类 - C++

当在C ++中获得指向基类的指针时,为什么不为派生类对象调用重载函数?

在基类中声明的C#接口方法无需在派生类中再次实现

C#:在基类中定义方法实现,在派生类中定义属性

如何在C ++中从基类构造函数调用派生类方法?

从基类类型的指针数组中调用派生类的方法。(C ++)

C++:如何向前声明出现在基类的静态方法中的派生类?

在C#中的基类中使用泛型:如何确保基类中的方法返回派生类的类型?

派生类无法使基类中的私有成员重载其他基类中的私有成员

基类和派生类C ++

C++:使用重载而不是动态转换通过基类选择派生类

C ++类继承在派生类中的单独方法

C#:我的派生类无法覆盖基类的接口方法实现,为什么?

为什么`this`在调用派生类对象时无法从基类方法访问派生类成员

在C#中从派生类调用私有基方法

C ++:重载另一个类中的多个派生类

c ++方法调用(lvalue)绑定到派生类中的function(rvalue)而不是基类中的function(lvalue)

无法访问派生类中的受保护方法