C ++虚拟继承,类可见性?

时间:2012-06-14 03:54:28

标签: c++ oop class inheritance

所以这就是我的困境:

我有一个基类(比方说一个通用的Person类):

class Person{
public:
    Person();
    ~Person();
    virtual void Init();
    virtual void SaySomething();
};

现在我想让其他类继承这些方法。

class Worker: public Person{
public:

   Worker();
   ~Worker();

   void Init(){
     // would do some special initializing.
   }

   void SaySomething(){
     // Print something about the worker.
   }

};

现在我有一个经理班:

class Manager{
public:

   void Init();
   void Run();

   void SwitchPerson(Person* p);

protected:
   vector<Person*> people;
};

我给出的一个例子是一个人的子类可能不是最好的。但关键不在于类的内容,而是继承,更具体地说是类如何理解和了解其他类。

现在在我的主要功能中我会有以下内容:

int main()
{
  Manager* m = new Manager();
  m->Init();

  // Create a new worker;
  Person* w = new Worker();

  m->SwitchPerson(w);

  return 0;
}

现在我不确定这是否是解决问题的正确方法。问题是可以有无限量的子类,而经理类无法了解它们。 manager类只知道父(Person)类。因此,SwitchPerson会向向量添加类型为Person的新Worker类(现在我不确定这是否在结构上不正确,我有一种感觉。)。但首先需要确保向量中已经没有Worker Classes。我尝试使用typeid.name,但这显然会返回父(Person)类的名称。

我想过使用带有向量的模板..但是再次要求经理类知道Worker或任何其他子类。

如果您需要我解释其他任何内容或添加任何相关信息,请告诉我。

编辑:

注意:人员,工人和经理这两个词是无关紧要的。对于所有重要事项,它可能是相机,镜头和舞台。

SwitchPerson:

假设只有一个人可以同时活跃。使用相机,镜头和舞台类比会更有意义。由于只有一台摄像机可以进入屏幕,所以可以说。

让我们说我们一直在使用相机类比。我们有第一个场景,我们首先调用SwitchCamera()并传入新的Camera。但问题是Stage对象(将是经理)不了解镜头或不同类型的镜头。可能有100或10000.没关系。场景只知道相机是所有镜头类的基类。

因此,当我们切换相机()时,我们可以利用该物体来控制镜头(不是很现实,不管是什么)。所有控件首先作为Camera基类内的虚拟成员实现。所以镜片类都有相同的成员。

现在您已完成第一个场景并想再次切换相机。您将再次调用SwitchCamera()并传入新的第二个摄像头。在切换摄像机中,目标是将传递的摄像机对象设置为活动摄像机,然后将其推送到矢量。

但是我们不想要两个相同镜头的副本。这就是问题所在。我希望能够检查传入的Camera * camera = new Lense123();已经在向量中。如果是,那么我想使用原来的那个并丢弃新传递的那个。

2 个答案:

答案 0 :(得分:3)

听起来你希望Manager有一个唯一人的载体,即你可以拥有一个Worker,一个Person和一个ThirdPerson,但不能超过vector中的每一个?为什么不在Person中重载一个函数,该函数返回子类的字符串标签,并遍历为每个函数调用pPerson-&gt; GetLabel()的向量,并将其与您想要添加的新对象的标签进行比较向量。

管理器仍然只知道Person类,不必知道有关Person的不同子类的任何信息,但可以从每种类型中获取唯一的字符串。

答案 1 :(得分:0)

经理是个人,而不是经理有人。我会从Person继承经理,经理有1 ... N个员工,所以最好的办法是: 从Person继承管理器 在Manager中有一个向量。 我会把类Person变为虚拟,所以没有人可以实现“人”