Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;虚拟继承,类可见性?_C++_Oop_Class_Inheritance - Fatal编程技术网

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

C++ C++;虚拟继承,类可见性?,c++,oop,class,inheritance,C++,Oop,Class,Inheritance,因此,我的困境是: 我有一个基类(比如泛型Person类): 现在我想让其他类继承这些方法 现在我将有一个经理类: 现在我不确定这是否是解决问题的正确方法。问题是子类的数量是无限的,而管理类却不知道它们。manager类只知道父(人)类。因此SwitchPerson会将Person类型的新工人类(现在我不确定这在结构上是否不正确,我有一种感觉)添加到向量中。但首先它需要确保向量中没有工作类。我尝试使用typeid.name,但这显然返回了父(Person)类的名称 我想用一个带有向量的模板。。但

因此,我的困境是:

我有一个基类(比如泛型Person类):

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

现在我将有一个经理类:

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

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

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

编辑:

注:人员、工人和经理这三个术语不相关。它可以是照相机、镜头和舞台,为所有重要的东西

切换人:

假设一次只能有一个人活跃。用相机、镜头和舞台来类比,这会更有意义。因为只有一个摄像头可以进入屏幕,让我们说

让我们假设我们与摄影机的类比是一致的。我们有了第一个场景,我们首先调用SwitchCamera()并传入新的摄影机。但问题是舞台对象(可能是经理)不知道镜头或不同类型的镜头。可能有100或10000个。没关系。场景只知道摄影机,它是所有镜头类的基类

因此,当我们切换Camera()时,我们可以利用对象来控制镜头,比如说(不是很逼真,但不管怎样)。所有控件首先作为摄影机基类内的虚拟成员实现。所以透镜类都有相同的成员

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


但是我们不想要同一个镜头的两个拷贝。这就是问题所在。我希望能够检查传入的摄像头*摄像头=新镜头123();已经在向量中了。如果是,那么我想使用原来的一个,丢弃新通过的一个。

经理是人,而不是经理有人。我会从Person继承经理,而经理有1…N名员工,所以最好的做法是: 从个人继承经理 在管理器中有一个向量。
我会将类Person虚拟化,这样就没有人可以实现“Person”

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


Manager仍然只知道Person类,不必知道Person的不同子类,但可以从每个类型中获取唯一的字符串。

Manager m()不创建对象
m
。任何一个好的编译器都应该警告它。我只是很快地编写了代码,问题的真正实现与Person、Worker或Manager无关。也许让Person抽象类吧?你大部分都在那里。但是,你能解释一下这一点吗:o SwitchPerson会将Person类型的新工人类(现在我不确定这在结构上是否不正确,我有一种感觉)添加到向量中。但首先它需要确保向量中没有工人类。编辑我的帖子是为了提供更好的类比,更好地解释SwitchPerson或现在的SwitchCamera。我想我没有澄清。。。Manager只是一个用来管理Person对象的类名。它与人或工人无关。此外,个人、工人和经理也无关紧要。它将是照相机、镜头和舞台。我想弄清楚的是,经理/舞台是如何不知道子元素,但仍然有它们的向量的?先生,你已经破解了我的代码。这正是我一直在寻找的,当然它最终就这么简单。谢谢!:)我没有重载GetLabel(),而是在Person类中添加了一个字符串m_label作为受保护的。在person类中,有一个GetLabel方法返回m_label。m_标签设置在Worker或任何子类构造函数中。
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;
}