C++当子类的成员函数与父类的成员函数重名时:
若父类没有virtual声明,子类函数可以和父类函数返回值不同,但函数名和参数列表必须相同.
则子类实例通过"."调用的是子类的函数
若子类想调用父类的函数,则需要使用 子类实例.父类::函数名() 的形式.
父类实例通过"."调用的是父类的函数
父类无法调用子类的同名函数
若通过指针->调用
则指针的类型 决定 调用哪个类的函数
父类地址强制转换为子类指针 也可以调用子类的函数.
若父类有virtual声明,
虚函数就固定了函数的形式,所以子类函数和父类函数的返回类型也必须一致,否则报error: conflicting return type specified for ‘virtual int CDerive::show()’
则通过"."调用时,
子类实例调用子类函数,父类实例调用父类函数.
若通过"->"调用时,
则多态性成立,即当使用基类指针通过->调用时,根据指针的内容确实是基类地址还是子类地址,分别调用对应的函数.子类地址赋给父类指针,默认调用的是子类的函数,但可以通过 父类指针->父类::函数名() 明确调用父类的函数.
当用子类指针通过->调用时,将父类地址强制转换为子类指针,则默认调用的仍然是其本质的函数 即 父类的函数 可以通过 子类指针->子类名::函数名() 强制调用子类的函数.
将子类指针指向子类实例地址时,默认调用子类函数,可以通过 子类指针->父类名::函数名() 强制调用父类的函数.
当参数不一样时,则是两个函数,
此时通过->调用函数 取决于指针变量的类型决定调用哪个函数 而与其实质值无关.
子类类型的指针可以通过 子类指针->父类名::函数名() 强制调用父类函数.
时间: 2024-12-12 14:49:40