派生类的方法需要向下转换其参数

时间:2010-01-30 15:56:29

标签: c++

以下是示例代码:

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类也应该包含容器,因此在这个类中实现的函数可以使用它。

1 个答案:

答案 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);
}