例如,我有三个类:A,B :: A和C :: A,只有B和C有虚方法print(),就像那样:
#include <iostream>
using namespace std;
class A {
public:
virtual void print() {
return;
//do nothing
}
static void Func() {
//how to call all virtual functions print() for one class A?
print(); //doesn't work
}
};
class B : public A {
public:
virtual void print() {
cout << "B" << endl;
}
};
class C : public A {
public:
virtual void print() {
cout << "C" << endl;
}
};
int main() {
B b1;
B b2
C c;
A::Func();
return 0;
}
我只使用类A对所有继承的对象(b1,b2,c)使用print()。我该怎么办?
答案 0 :(得分:1)
声明A
的静态类成员,它是指向A
或其子类的所有实例的指针的容器。 std::list
将是一个很好的选择:
class A {
static std::list<A *> all_instances;
public:
// ...
};
在A的构造函数中,将其this
添加到列表中,保存新的列表条目的迭代器。在A的析构函数中,从列表中删除其列表条目。
现在您将拥有一个私有容器,它枚举A
或其任何子类的所有实例。
此时编写一个调用每个print()
方法的静态类方法变得微不足道。
当然,如果这是一个问题,那么实现线程安全需要一些额外的工作。
为A的构造函数或析构函数编写代码将是您的作业。