好的,这是我的问题。我有以下类(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,但是编译器将不了解这些功能,并且我不为所有人测试什么类型的对象,然后将其强制转换,所以我可以调用正确的函数。
所以可以将所有函数都放在基类中,因为那样我就没问题了,但是我不知道这是否正确,如果一个类处理Songs,而另一个类处理视频,我很好意味着有2个类
如果我不清楚,请说出来,我会尽力解释。
简而言之,我想使用多态主义。
最佳答案
将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
和end表示子类必须提供这些功能的实现(它们是pure virtual member functions)。其次,您的类
SongJob
具有成员std::vector<Job>
。几乎可以肯定这不是您想要的。如果将SongJob
添加到此 vector ,它将变为普通的Job
。此效果称为slicing。为了防止这种情况,您必须将其设置为std::vector<Job*>
。这里还有更多要说的话,但这将走得更远。我建议您得到一个好的book。
关于c++ - 正确设置OOP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6544451/