gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:33 25 4
gpt4 key购买 nike

所以这是我的困境:

我有一个基类(假设是一个通用的 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;
}

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

我想过使用带有 vector 的模板..但是同样需要经理类了解 worker 或任何其他子类。

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

编辑:

注意:Person、Worker 和 Manager 等术语无关紧要。重要的可能是相机、镜头和舞台。

交换生:

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

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

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

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

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

最佳答案

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

Manager 仍然只知道 Person 类,不需要知道 Person 的不同子类,但可以从每个类型返回一个唯一的字符串。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com