Method of derived class needs to downcast its parameter
以下是示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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,因为这两个类的许多代码是相同的,除了一个方法add()。derivedTracker::add()方法需要调用特定于派生类的函数。但我不想做动态铸造。我认为我应该使用它的时候不是这样。另外,跟踪器类应该包括容器,所以在这个类中实现的函数可以使用它。
听起来,跟踪器类最好是一个模板,而不是从一个共同的祖先派生的:
1 2 3 4 5 6 7 8 9 10 | template<typename Element> class Tracker { public: void add(Element* p); private: vector< Element* > vec; }; typedef Tracker<Base> BaseTracker; typedef Tracker<Derived> DerivedTracker; |
然后可以添加使用
1 2 3 4 5 | template<> void Tracker<Derived>::add(Derived* p) { p->spec(); vec.push_back(p); } |