C++之派生类与基类的同名函数调用情况

注意:这里仅讨论同名函数为非虚函数情况

1 先看 非同名函数 调用情况

此种情况最简单,结论是可通过子类直接调用自己没有的父类函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Base
{
public:
void print()
{
cout << "I'am base class printer." << endl;
}
}
class Deprive: public Base
{
public:
void new_print()
{
cout << "I'am deprive class printer." << endl;
}
}

Deprive deprive;
deprive.print(); // 可以通过子类对象直接调用基类的函数

2 函数名相同,形参的个数或类型不同的情况

结论:

  • 子类函数覆盖基类的同名函数,无法通过派生类直接调用基类同名函数(与Python可以直接调用父类函数也不同)
  • 可以显示调用基类函数
  • 可以使用基类指针指向派生类对象,通过指针调用基类函数
  • 这种情况是最需要要关注的,不属于函数重载,注意区分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Deprive: public Base
{
public:
void print(int a)
{
cout << "I have a int type parameter." << a << endl;
}
}
Deprive deprive;
deprive.print(); // 编译不通过,无法通过子类对象直接调用基类的同名方法
deprive.Base::print(c); // ok, 方法一:显示调用基类方法
Base * pt;
pt = &deprive;
pt->print(); // ok, 方法二:定义基类指针,让基类指针指向派生类对象,用指针调用基类函数

3 函数名相同,形参的个数和类型也相同的情况

结论:

  • 子类覆盖父类同名函数,直接用子类对象调用同名函数会默认调用子类的函数。
    这种情况下想调用基类方法,与函数名相同,形参的个数或类型不同的情况相同
------ 本文结束------
赞赏此文?求鼓励,求支持!
0%