仅将继承用于c ++中的多态

Tom*_*des 4 c++ polymorphism inheritance

我正在用C++设计一个项目并且到了我怀疑的地步,而我应该使用继承来获得多态性.

具体地讲,我有一个类JazzQuartet,其具有4个对象:Saxophonist,Pianist,BassistDrummer,每一个play()listen()方法,具有不同的实现.

我想让它们都继承自一个类,Musician所以我可以拥有一个Musician对象数组并调用每个play()人和listen()方法,所以我可以Musician listen()对任何其他人做任何事.但是由于它们的实现完全不同,我只是为了获得多态性而使用这种遗产,我不确定这是否是一个好的设计选择.

对此事有何建议?

谢谢大家!

πάν*_*ῥεῖ 8

"...所以我可以拥有一系列音乐家对象并调用每个人的play()和listen()方法,这样我就可以让任何音乐家听()给任何其他人."

Musician 应该是一个抽象类,即一个接口:

 class Musician {
 public:
     virtual void play() = 0;
     virtual void listen(Musician& other) = 0;
     virtual bool isPlaying() = 0;
     virtual ~Musician() {}
 };
Run Code Online (Sandbox Code Playgroud)

是的,它被认为是促进界面的好设计.

通过这种方式,您可以强制派生类必须实现这些功能,并允许客户端访问Musician实例,而无需了解具体的派生类型.

正如您一直要求将整个集合存储到数组中:

通过上述设计,您可以使用一组数据std::unique_ptr<Musician>来聚合特定的音乐家群.

std::vector<std::unique_ptr<Musician>> jazzQuartet(4);
std::unique_ptr<Saxophonist> sax = new Saxophonist();
std::unique_ptr<Pianist> piano = new Pianist();
std::unique_ptr<Bassist> bass = new Bassist();
std::unique_ptr<Drummer> drums = new Drummer();

jazzQuartet[0] = sax;
jazzQuartet[1] = piano;
jazzQuartet[2] = bass;
jazzQuartet[3] = drums;

// And wire them up as necessary
//------------------------------------

// Usually everyone in the combo needs to listen to the drums
sax->listen(*drums);
piano->listen(*drums);
bass->listen(*drums);

...

// Let them all play
for(auto& m : jazzQuartet) { // Note the & to avoid copies made for the items
    m->play();
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*etr 7

我认为没有理由担心您的Musician实现将没有任何通用代码.事实上,这正是所谓的纯抽象类.通常,分离界面概念是个好主意.

它提供了比你提到的更多的优点,最重要的是你很可能会发现你的其他代码不需要知道Musician它的特定类型,因此你的主代码会更简单.

而且这也不是"只是"多态,它也会促使封装很多,因为用户将被迫使用Musician接口.

另外,我认为将来你可能会发现你真的需要一些不同音乐家之间的共同代码(比如导演/指挥对象参考?).

  • 非常感谢你的回答,希望我能投两个正确的答案! (2认同)
  • @Lajotas我赞成了一些答案来衡量你的顾虑;-) ... (2认同)

Dan*_*iel 5

这是多态性的完全合理用法. Saxophonist,Pianist,Bassist,并且Drummer都表现出一个"是"的有关系Musician.

您的Musician类将是纯虚拟的(也称为接口).