基类指针pBase指向派生类对象basePlus,基类与派生类含有同名同参的函数,pBase调用函数应该调用哪个,当函数有虚函数时又该调用哪个?
- 基类指针pBase指向派生类对象basePlus时,基类与派生类都含有同名同参函数且是一虚一实,pBase调用他们中的实函数
- 基类与派生类都含有同名同参函数,且都是实函数时,调用的是基类的函数。
- 基类与派生类都含有同名同参函数,且都是虚函数时,调用的是派生类的函数。
(1)基类与派生类都含有同名同参函数,基类的函数是虚函数,派生类是实函数
#include <iostream>
using namespace std;
class Base
{
public:
virtual int fun(char i[30])
{
cout << "调用基类函数" << endl;
return sizeof(i);
}
};
class BasePlus : public Base
{
public:
int fun(char i[30])
{
cout << "调用派生类函数" << endl;
return sizeof(i);
}
};
int main() {
BasePlus d;
Base* b = &d;
char i[20];
cout << b->fun(i) << endl;
return 0;
}
输出:
调用派生类函数
4
(输出为4的原因是int fun(char i[30])中的i不是数组名,而是一个指针,指针在64位系统中为4个字节)
(2)基类与派生类都含有同名同参函数,基类的函数是实函数,派生类是虚函数
#include <iostream>
using namespace std;
class Base
{
public:
int fun(char i[30])
{
cout << "调用基类函数" << endl;
return sizeof(i);
}
};
class BasePlus : public Base
{
public:
virtual int fun(char i[30])
{
cout << "调用派生类函数" << endl;
return sizeof(i);
}
};
int main() {
BasePlus d;
Base* b = &d;
char i[20];
cout << b->fun(i) << endl;
return 0;
}
输出:
调用基类函数
4
由(1)(2)得出结论:基类指针pBase指向派生类对象basePlus时,基类与派生类都含有同名同参函数且是一虚一实,pBase调用他们中的实函数。
(3)基类与派生类都含有同名同参函数,且都是实函数
#include <iostream>
using namespace std;
class Base
{
public:
int fun(char i[30])
{
cout << "调用基类函数" << endl;
return sizeof(i);
}
};
class BasePlus : public Base
{
public:
int fun(char i[30])
{
cout << "调用派生类函数" << endl;
return sizeof(i);
}
};
int main() {
BasePlus d;
Base* b = &d;
char i[20];
cout << b->fun(i) << endl;
return 0;
}
输出:
调用基类函数
4
结论:基类与派生类都含有同名同参函数,且都是实函数时,调用的是基类的函数。
(4)基类与派生类都含有同名同参函数,且都是虚函数
#include <iostream>
using namespace std;
class Base
{
public:
virtual int fun(char i[30])
{
cout << "调用基类函数" << endl;
return sizeof(i);
}
};
class BasePlus : public Base
{
public:
virtual int fun(char i[30])
{
cout << "调用派生类函数" << endl;
return sizeof(i);
}
};
int main() {
BasePlus d;
Base* b = &d;
char i[20];
cout << b->fun(i) << endl;
return 0;
}
输出:
调用派生类函数
4
结论:基类与派生类都含有同名同参函数,且都是虚函数时,调用的是派生类的函数。