基于继承的类型参数更改父虚函数的行为

Changing behaviour of parent virtual function based on inherited type parameter

我有一个包含基础 class 和两个派生 class 的继承层次结构。

在基础class中,我有一个虚函数:

virtual void interact(const Base &other) const;

在派生的 classes 中,它们都具有以下两个功能,这是必需的,因为两个派生的 classes 相互作用不同(即 Derived1Derived1Derived1Derived2) 的交互方式不同:

void interact(const Derived1 &other) const;
void interact(const Derived2 &other) const;

我希望能够从 vector<Base> 中获取两个对象并调用虚拟 Base class 方法(例如 base1.interact(base2))并在基于派生类型调用的派生 classes。

有什么方法可以做到这一点,还是我的方法完全错误?

Is there a way I can do this, or is my approach wrong entirely?

您正在寻找的技术称为双重调度
并非完全错误。例如,模式 visitor 是建立在相同概念之上的。

它遵循基于您问题中的详细信息的最小工作示例:

#include<iostream>

struct Derived1;
struct Derived2;

struct Base {
    virtual void interact(const Base &) const = 0;
    virtual void interact(const Derived1 &) const = 0;
    virtual void interact(const Derived2 &) const = 0;
};

struct Derived1: Base {
    void interact(const Base &other) const override {
        other.interact(*this);
    }

    void interact(const Derived1 &) const {
        std::cout << "Derived1/Derived1" << std::endl;
    }

    void interact(const Derived2 &) const {
        std::cout << "Derived2/Derived1" << std::endl;
    }
};

struct Derived2: Base {
    void interact(const Base &other) const override {
        other.interact(*this);
    }

    void interact(const Derived1 &) const {
        std::cout << "Derived1/Derived2" << std::endl;
    }

    void interact(const Derived2 &) const {
        std::cout << "Derived2/Derived2" << std::endl;
    }
};

void foo(const Base &lhs, const Base &rhs) {
    lhs.interact(rhs);
}

int main() {
    foo(Derived1{}, Derived1{});
    foo(Derived1{}, Derived2{});
    foo(Derived2{}, Derived1{});
    foo(Derived2{}, Derived2{});
}

它要求所有 interact 方法都是虚拟的并且是基础 class 的一部分。
基本思想是 class 将对 Base 的引用作为参数传递给它,并将其自身用作(让我说) 标签 以正确地将请求分派给正确的方法。
它通过回调调用者并将自身作为函数参数传递来实现。