昨天讲了继承,那么今天就来讲讲同样属于C++三大特性的多态!
首先,什么是多态?我自己看了好多文章,但是说真的我都不是很懂类似于叫:多态就是同一个接口对于不同请求做出的不同处理这句话,但是在我对真理不屑的追求之下,我还是发现了最通俗的解释:
多态就是基类指针或引用表现出来的多种形态,他一会表现出父类形态(也就是指向自己),一会又可以表现出指向自己某个子类甚至(用指针数组)指向多个子类的形态,这就是C++多态的体现!
下面我们针对于这句理解作一详细的代码演示:
…
芜湖,说到多态,我居然忘记了把virtual老人家请出来介绍了,没有virtual修饰基类里面的函数,那怎么敢叫多态呢!所以说,virtual修饰基类里的函数,才可以体现出C++多态性来。
这下正式写代码展示:
class Base {
public:
void func()
{
cout << "I am Father!" << endl;
}
};
class Derived : public Base {
public:
void func()
{
cout << "I am Son!" << endl;
}
};
void foo(Base& b)
{
b.func();
}
int main()
{
Base b;
Derived d;
Base* p = &d;//父类指针指向子类对象
Base& br = d;//父类引用指向子类对象
b.func();
d.func();
p->func();
br.func();
foo(d);
}
看!这是我不用virtual修饰父类的func()函数的代码,那么他的输出就显而易见:
他除了第二个调用了子类里面的func()函数外,其他全部调用了父类的func()函数,这就没有体现出多态性来,那么当我们加上virtual关键之修饰父类func()函数之后效果就不一样了:
class base {
public:
virtual void func() //在这里我们加上virtual关键字修饰
{
cout << "i am father!" << endl;
}
};
class derived : public base {
public:
void func()
{
cout << "i am son!" << endl;
}
};
void foo(base& b)
{
b.func();
}
int main()
{
base b;
derived d;
base* p = &d;
base& br = d;
b.func();
d.func();
p->func();
br.func();
foo(d);
}
我们能来一下输出结果:
看,这不就调到父类指针或者引用指向的地方了!
这就是C++多态性的体现