关于oop:C ++虚拟继承,类可见性?

C++ Virtual Inheritance, Class Visibility?

所以我的困境是:

我有一个基类(比如一般的Person类):

1
2
3
4
5
6
7
class Person{
public:
    Person();
    ~Person();
    virtual void Init();
    virtual void SaySomething();
};

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Worker: public Person{
public:

   Worker();
   ~Worker();

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

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

};

现在我要上经理班:

1
2
3
4
5
6
7
8
9
10
11
class Manager{
public:

   void Init();
   void Run();

   void SwitchPerson(Person* p);

protected:
   vector<Person*> people;
};

我举的一个例子,工人是一个人的儿童阶级,可能不是最好的。但重点不是类的内容,而是继承,更具体地说是类如何理解和了解其他类。

现在,在我的主要功能中,我将具有以下功能:

1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
  Manager* m = new Manager();
  m->Init();

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

  m->SwitchPerson(w);

  return 0;
}

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

我想用一个带有向量的模板……但同样,这需要经理班了解工人班或任何其他儿童班。

如果你需要我解释其他事情或添加任何相关信息,请告诉我。

编辑:

注意:术语"人、工人和经理"是不相关的。它可以是照相机、镜头和舞台。

SwitchPerson:

假设一次只能有一个人活动。这对于摄像机、镜头和舞台的类比会更有意义。比如说,只有一个摄像头可以进入屏幕。

比方说,我们是按照照相机的类比来做的。我们有了第一个场景,我们首先调用switchcamera()并传入新的摄像头。但问题是舞台对象(经理)不知道镜头或不同类型的镜头。可能有100或10000个。没关系。场景只知道相机是所有镜头类的基础类。

所以当我们切换camera()的时候,我们就可以利用对象来控制镜头,比如说(不是很现实,但无论如何)。所有控件都首先作为摄像机基类中的虚拟成员实现。所以镜片课程都有相同的成员。

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

但我们不想要同一个镜片的两份。这就是问题所在。我想检查传入的camera*camera=new lense123();是否已经在向量中。如果是的话,我想用原来的那个,把新通过的那个扔掉。


听起来你想让经理有一个独特的人,也就是说你可以有一个工人,一个人,和一个第三个人,但每个人都不能超过一个?为什么不亲自重载一个函数,该函数返回子类的字符串标签,并为每个子类循环调用pperson->getlabel()的向量,并将其与您要添加到向量的新对象的标签进行比较。

管理器仍然只知道Person类,不必知道Person的不同子类,但可以从每种类型中获得唯一的字符串。


经理是人,而不是经理有人。我将从个人继承经理,一个经理有1…n个员工,所以最好做的是:从人员继承经理在管理器中有一个向量。我将使类人虚拟化,这样就没有人能够实现"人"