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个员工,所以最好做的是:从人员继承经理在管理器中有一个向量。我将使类人虚拟化,这样就没有人能够实现"人"