gpt4 book ai didi

c++ - 正确使用 OOP

转载 作者:太空狗 更新时间:2023-10-29 23:47:15 24 4
gpt4 key购买 nike

好的,这是我的问题。我有以下类(class):

class Job {
bool isComplete() {}
void setComplete() {}
//other functions
};

class SongJob: public Job {
vector<Job> v;
string getArtist() {}
void setArtist() {}
void addTrack() {}
string getTrack() {}
// other functions
};
// This were already implemeted

现在我想实现一个 VideoJob 并从 Job 派生它。但这是我的问题。我还有以下功能,它被设置为仅适用于 SongJob:

void process(SongJob s)
{
// not the real functions
s.setArtist();
..............
s.getArtist();
.............
s.getArtist();
...............
s.setArtist()
}

这里我只是想让它表明该函数仅使用派生对象方法。因此,如果我有另一个从 Job 派生的对象,我将需要将参数更改为 Job,但是编译器将不知道这些函数,我也不知道要为每个人测试它是什么类型的对象,然后将其强制转换,所以我可以调用正确的函数。

所以将所有功能放在基类中是可以的,因为这样我就没有问题了,但我不知道这是否是正确的 OOP,如果一个类处理歌曲而另一个类处理视频,我好的oop意味着有2个类(class)。

如果我没说清楚,请说出来,我会尽力解释得更好。
简而言之,我想使用多态性。

最佳答案

将类SongJob 中的所有内容放入其中完全没问题。和 VideoJob有一个共同的基类。但是,一旦您想添加 Job 的子类,这就会出现问题。这与艺术家无关。

关于您发布的代码,有一些事情需要注意。一、贵类Job显然不是 abstract base class .这意味着您可以拥有仅仅是工作的工作。不是SongJob而不是 VideoJob .如果要说清楚不能有一个简单的Job , 使基类抽象:

class Job {
virtual bool isComplete() = 0;
virtual void setComplete() = 0;
//other functions
};

现在,您无法创建 Job 的实例:

Job job; // compiler-error
std::vector<Job> jobs; // compiler-error

请注意,这些函数现在是虚拟的,这意味着子类可以覆盖它们。 = 0结尾意味着子类必须提供这些函数的实现(它们是 pure virtual member functions )。

其次,你们类SongJob有成员(member)std::vector<Job> .这几乎肯定不是您想要的。如果您添加 SongJob到这个 vector ,它将成为一个正常的 Job .此效果称为 slicing .为了防止它,你必须把它变成 std::vector<Job*> .

这里还有很多话要说,但到此为止。我建议你好好的book .

关于c++ - 正确使用 OOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6544451/

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