多态的概念及其构成条件
多态概念:对不同的对象会有不同的实现方法,即为多种形态。
构成条件:
- 派生类要进行虚函数的重写(父子类虚函数需要三同,三同指函数名、参数、返回值)
- 要用父类的指针或引用去调用虚函数
三同有种列外:协变(基类与派生类的虚函数返回值不同)
其他注意事项:
- 析构函数的重写(看似不符合函数名相同的条件,实际上编译器对其进行了特殊处理,编译后析构函数的名字统一处理成destructor)
- 派生类虚函数重写可以不加virtual(但建议写上)
重载、重写、重定义
注意:重写是指重写函数体。
如下图,有这么一道题:b通过虚函数表调用了继承的test(),test()又通过虚函数表找到自己的(重写的)func()结果打印出来的结果却是B:1,其使用的缺省值是A类中的func()的缺省值,所以实际上b调用func函数时使用的是自己的函数体,声明却是使用原声明。
class A
{
public:virtual void func(int val = 1){cout << "A:" << val << endl;}virtual void test(){func();}
private:int a;
};class B: public A
{
public://virtual void func(int val = 0)void func(int val = 0){cout << "B:" << val << endl;}
private:int b;
};int main()
{B* b = new B;b->test();return 0;
}
纯虚函数
纯虚函数就是在虚函数的声明后加上 =0 ,有纯虚函数的类被称作抽象类,抽象类不能实例化对象。如果继承的派生类不重写纯虚函数,那么这个派生类也是抽象类。