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

标签 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;
};

我给出的 Worker 是 Person 的子类的例子可能不是最好的。但重点不在于类的内容,而在于继承,更具体地说,类如何理解和认识其他类。

现在在我的主函数中我将具有以下内容:

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 类添加到 vector 中(现在我不确定这在结构上是否不正确,我有一种感觉。)。但首先它需要确保 vector 中没有 Worker 类。我尝试使用 typeid.name 但这显然返回父(Person)类的名称。

我想过使用带有 vector 的模板..但这又需要管理器类了解 Worker 或任何其他子类。

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

编辑:

注意:术语“人员”、“ worker ”和“经理”是不相关的。重要的可能是相机、镜头和舞台。

切换人:

假设一次只能有一个人处于事件状态。通过相机、镜头和舞台的类比就更有意义了。因为只有一台摄像机可以进入屏幕,所以可以这么说。

假设我们继续使用相机类比。我们有了第一个场景,我们首先调用 SwitchCamera() 并传入新的相机。但问题是舞台对象(即管理器)不了解镜头或不同类型的镜头。可能有100个,也可能有10000个。这并不重要。场景只知道相机,它是所有镜头类的基类。

因此,当我们 switchCamera() 时,我们可以利用该对象来控制镜头(不是很现实,但无论如何)。所有控件首先作为 Camera 基类内的虚拟成员实现。因此,镜头类都具有相同的成员。

现在您已经完成了第一个场景并想要再次切换相机。您将再次调用 SwitchCamera() 并传入新的第二个相机。在切换相机中,目标是将传递的相机对象设置为事件相机,然后将其推送到 vector 。

但我们不想要相同镜头的两个拷贝。这就是问题所在。我希望能够检查是否传入了 Camera*camera = new Lense123();已经在 vector 内部。如果是的话我想使用原来的并丢弃新通过的。

最佳答案

听起来您希望 Manager 有一个由唯一人员组成的 vector ,即您可以有一个 Worker、一个 Person 和一个 ThirdPerson,但 vector 中每个人不能超过一个?为什么不直接在 Person 中重载一个函数,该函数返回子类的字符串标签,并遍历 vector ,为每个 vector 调用 pPerson->GetLabel() ,并将其与您想要添加到 vector 中的新对象的标签进行比较.

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

关于C++ 虚拟继承、类可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11026450/

相关文章:

php - 在一个类中拥有相当数量的公共(public)属性是否合理?

c++ - (3^n + 2^n) % 10 对于大 n

java - 从序列化构建对象 - 哪个是首选?

c++ - 当与可能导致缓冲区溢出的函数一起使用时,是否应该比其他变量更仔细地检查外部变量?

c++ - 在这种特定情况下,多重继承有那么糟糕吗?

c++ - 这种情况有没有更好的办法[垂头丧气]

c++ - 是否可以在 C++ 中将指向类成员的指针作为单个参数传递?

java - 在泛型类中创建 Java 泛型类型的实例

c++ - 如何限制QLayout增长?

类对象的 C++ 引用返回-为什么不调用复制构造函数?