我有3个班,A,B和C:
$ cat /etc/debian_version
jessie/sid
和class A {
public:
virtual bool sm(B b) = 0;
virtual bool sm(C c) = 0;
};
class B : public A {
bool sm(B b) {
//code
}
bool sm(C c) {
//code
}
};
class C : public A {
bool sm(B b) {
//code
}
bool sm(C c) {
//code
}
};
,存储B或C对象。 (例如,他们随机生成)
我能以某种方式打电话吗
vector<A*> objects
没有动态演员或其他什么?因为可以有更多的B-C类
它是一个袋子的东西,可能有更好的方法吗?
解
正如for(int i = 0; i < objects.size(); i++) {
for(int j = i; j < objects.size(); j++) {
objects[i].sm(objects[j]);
}
}
所说,我理解,这是我的问题的解决方案
odelande
此代码输出
在做B的B中 在C做B
在B做C
在C做C
答案 0 :(得分:0)
你不能这样做。 sm()
方法的重载是静态解析的,即在编译时(此外,sm()
应该将指针带到B
和C
)。但编译器只知道objects[j]
是A*
;它无法解析调用,因为没有重载需要A*
作为输入。
您想要的是根据objects[j]
的运行时类型调度调用。这就是对虚函数的调用。所以,你应该只有一个sm()
方法,它应该反过来调用它的参数的另一个虚方法。
答案 1 :(得分:0)
您正在搜索访客模式,多次调度。关键是你在sm(A&amp; a)中引用一个引用并在其上调用smT(...) 。 (代码仅用于示例目的,需要清理和修复。)
class A {
protected:
virtual bool smB(B& b) = 0;
virtual bool smC(C& c) = 0;
public:
virtual bool sm(A& a) = 0;
};
class B : public A {
protected:
bool smB(B& b) {
// code,
}
bool smC(C& b) {
// code
}
public:
bool sm(A& a) {
a.smB( *this ); // this is smC(...) in class C
}
};