C++当子类的成员函数与父类的成员函数重名时:

若父类没有virtual声明,子类函数可以和父类函数返回值不同,但函数名和参数列表必须相同.

则子类实例通过"."调用的是子类的函数

若子类想调用父类的函数,则需要使用 子类实例.父类::函数名() 的形式.

父类实例通过"."调用的是父类的函数

父类无法调用子类的同名函数

若通过指针->调用

则指针的类型 决定 调用哪个类的函数

父类地址强制转换为子类指针 也可以调用子类的函数.


若父类有virtual声明

虚函数就固定了函数的形式,所以子类函数和父类函数的返回类型也必须一致,否则报error: conflicting return type specified for ‘virtual int CDerive::show()’

则通过"."调用时,

子类实例调用子类函数,父类实例调用父类函数.

若通过"->"调用时,

则多态性成立,即当使用基类指针通过->调用时,根据指针的内容确实是基类地址还是子类地址,分别调用对应的函数.子类地址赋给父类指针,默认调用的是子类的函数,但可以通过 父类指针->父类::函数名()  明确调用父类的函数.

当用子类指针通过->调用时,将父类地址强制转换为子类指针,则默认调用的仍然是其本质的函数 即 父类的函数 可以通过 子类指针->子类名::函数名() 强制调用子类的函数.

将子类指针指向子类实例地址时,默认调用子类函数,可以通过 子类指针->父类名::函数名() 强制调用父类的函数.

当参数不一样时,则是两个函数,

此时通过->调用函数 取决于指针变量的类型决定调用哪个函数 而与其实质值无关.

子类类型的指针可以通过 子类指针->父类名::函数名() 强制调用父类函数.

子类继承时,重载应在函数后面加上override;前面的virtual可以不加,但最好加上,用于子子类的情况