好的,这是我的问题。我有以下类(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个类

如果我不清楚,请说出来,我会尽力解释。
简而言之,我想使用多态主义。

最佳答案

SongJobVideoJob类共有的所有东西放到一个通用的基类中是完全可以的。但是,一旦要添加与艺术家无关的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/

10-09 03:17