我有A,B和C 3个班级:
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
}
};
和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]);
}
}
没有动态转换或其他内容?因为可能会有更多的BC课程,
并且这是一件手提袋事情,也许有更好的方法可以做到这一点?
解决方案
正如odelande
我所了解的,这是解决我的问题的方法
#include <iostream>
#include <vector>
class B;
class C;
class A {
public:
virtual bool sm(A* a) = 0;
virtual bool sm(B* b) = 0;
virtual bool sm(C* c) = 0;
};
class B : public A {
public:
bool sm(A* a) {
return a->sm(this);
}
bool sm(B* b) {
std::cout << "In B doing B" << std::endl;
return true;
}
bool sm(C* c) {
std::cout << "In B doing C" << std::endl;
return false;
}
};
class C : public A {
public:
bool sm(A* a) {
return a->sm(this);
}
bool sm(B* b) {
std::cout << "In C doing B" << std::endl;
return true;
}
bool sm(C* c) {
std::cout << "In C doing C" << std::endl;
return false;
}
};
int main() {
std::vector<A*> objects;
objects.push_back(new B());
objects.push_back(new C());
objects[0]->sm(objects[0]);
objects[0]->sm(objects[1]);
objects[1]->sm(objects[0]);
objects[1]->sm(objects[1]);
std::cin.get();
return 0;
}
该代码输出
在B中做B
在C中做B
在B中做C
在C中做C
你不能这样做。在的重载sm()
方法静态解析,即在编译时(此外,sm()
应采取指针来B
和C
)。但是编译器只知道那objects[j]
是一个A*
; 它无法解决该调用,因为没有将aA*
作为输入的重载。
您想要的是基于的运行时类型调度呼叫objects[j]
。这就是对虚函数的调用。因此,您应该只有一个sm()
方法,而该方法又应调用其参数的另一个虚拟方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句