C++中多态如果反过来看,就是“少态”。关于C++中多态和重载的问题,先来看下面的例子:
class Sound {
public:
int value;
void louder() { value++; }
};
class Display {
public:
int value;
void brighter() { value+=10; }
};
这是两个完全没有联系的类。现在我们要为他们各写一个demo。demo可以这样写:
void DemoSound( Sound &s )
{
int i;
for(i=0; i<10; i++) s.lounder();
}
void DemoDisplay( Display &d )
{
int i;
for(i=0; i<10; i++) d.brighter();
}
讲究风格的C++程序员通常觉得这样写很无趣,函数名可以直接写成 void Demo( Sound &s ) 和 void Demo( Display &d ) 这样就是重载。
如果为class Sound和class Display配置一个共同的基础类,那么程序又变成这样:
class SoundDisplayBase {
public:
virtual void OnDemo()=0;
};
class Sound:public SoundDisplayBase {
public:
int value;
void louder() { value++; }
void OnDemo() { louder(); }
};
class Display:public SoundDisplayBase {
public:
int value;
void brighter() { value+=10; }
void OnDemo() { brighter(); }
};
void Demo( SoundDisplayBase &base )
{
int i;
for(i=0; i<10; i++) base.OnDemo();
}
这跟写了两个demo(), void Demo( Sound &s ) 和void Demo( Display &d )一样。就是说,作用在基础类上的函数,就好像在每个派生类上都重载过了一样。如果没有设计继承这个层次的话。
由是可知,为派生类对象写函数的时候,如果有继承链存在,只要有可能,就应当作用的尽可能靠前的派生类上。这样代码就会有尽可能大的适用性。
|