以下是示例代码:
class Base { public: virtual void common(); }; class Derived { public: void common(); virtual void spec(); // added function specific for this class }; class BaseTracker { public: void add(Base* p); private: vector < Base* > vec; }; class DerivedTracker { public: void add(Derived* p); private: vector < Derived* > vec; };
我希望DerivedTracker和BaseTracker从类Tracker派生,因为除了一个方法add()之外,这两个类的很多代码是相同的。 DerivedTracker :: add()方法需要调用特定于Derived类的函数。但我不想做动态铸造。我认为不应该使用它。 Tracker类也应该包含容器,因此在这个类中实现的函数可以使用它。
答案 0 :(得分:5)
听起来Tracker类最好是模板,而不是从共同的祖先派生出来:
template<typename Element>
class Tracker {
public:
void add(Element* p);
private:
vector< Element* > vec;
};
typedef Tracker<Base> BaseTracker;
typedef Tracker<Derived> DerivedTracker;
然后,您可以添加add()
方法的特化,该方法使用Derived
的特殊功能:
template<>
void Tracker<Derived>::add(Derived* p) {
p->spec();
vec.push_back(p);
}