我有以下代码:
class A{};
class B: public A{};
class C: public A{};
class MyVisitor
{
public:
void visit(B*);
void visit(C*);
};
然后是A*对象的集合,我想实现如下:
1)
MyVisitor visitor;
for(vector<A*>::iterator it = vec.begin(); it!= vec.end();it++)
visitor->visit(a);
2) 以某种方式在编译时确定,如果 A* 指向派生对象 D,并给出编译器错误,如果 MyVisitor::visit(D*)
函数不存在
我知道 1) 可以通过一些多方法实现来实现,我想我可以找到一些用于 c++ 的多方法实现。但是 2) 有可能吗?
最佳答案
您可以像这样使用 dynamic_cast
(在您的 for
循环体内),因为行为应该在运行时发生变化(根据实际数据类型) .
ClassB* ba = dynamic_cast<ClassB*>(a);
if (ba)
visitor->visit(ba);
ClassC* ca = dynamic_cast<ClassC*>(a);
if (ca)
visitor->visit(ca);
也许您的 visit
函数可能被声明为 virtual
(对于您的 ClassD
事物)。
否则将您的类组织为类树(而不是森林),并拥有最顶层的根类
class Topmost {
virtual int classnum() const;
并采用约定,每个非抽象类都赋予其唯一的classnum
等...或者具有元类机制(例如Qt具有)
关于C++ 多方法和编译时检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25563460/