基于继承的类型参数更改父虚函数的行为
Changing behaviour of parent virtual function based on inherited type parameter
我有一个包含基础 class 和两个派生 class 的继承层次结构。
在基础class中,我有一个虚函数:
virtual void interact(const Base &other) const;
在派生的 classes 中,它们都具有以下两个功能,这是必需的,因为两个派生的 classes 相互作用不同(即 Derived1
和 Derived1
与 Derived1
和 Derived2
) 的交互方式不同:
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
的引用作为参数传递给它,并将其自身用作(让我说) 标签 以正确地将请求分派给正确的方法。
它通过回调调用者并将自身作为函数参数传递来实现。
我有一个包含基础 class 和两个派生 class 的继承层次结构。
在基础class中,我有一个虚函数:
virtual void interact(const Base &other) const;
在派生的 classes 中,它们都具有以下两个功能,这是必需的,因为两个派生的 classes 相互作用不同(即 Derived1
和 Derived1
与 Derived1
和 Derived2
) 的交互方式不同:
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
的引用作为参数传递给它,并将其自身用作(让我说) 标签 以正确地将请求分派给正确的方法。
它通过回调调用者并将自身作为函数参数传递来实现。