实验思路
我们的头文件和main函数是这样
#include<iostream>
using namespace std;
int main() {
Derive d;
d.print(1);
Base* b = &d;
b->print(1);
}
Derive继承自Base,里面各定义一个print,有如下四种情况。
1 -
void Base::print(int a);
void Derive::print(int a,int b);
2 -
void Base::print(int a);
void Derive::print(int a, int b=1);
3 -
virtural void Base::print(int a);
virtual void Derive::print(int a, int b=1);
4 -
virtural void Base::print(int a);
virtual void Derive::print(int a);
情况1 非virtual重写
class Base
{
public:
void print(int a) {cout << "Base Sub's way: a = " << a << endl;}
};
class Derive:public Base
{
public:
void print(int a, int b) {cout << "Derive Sub's way: a = " << a << ", b = " << b << endl;}
};
结果在 d.print(1); 这句提示参数少了,也就是说重写了基类函数后之后不能再调用基类的函数,毕竟重写了。
情况2 非virtual重写+默认参数
class Base
{
public:
void print(int a) { cout << "Base Sub's way: a = " << a << endl; }
};
class Derive:public Base
{
public:
void print(int a, int b=1) {cout << "Derive Sub's way: a = " << a << ", b = " << b << endl;}
};
结果
Derive Sub’s way: a = 1, b = 1 Base Sub’s way: a = 1
也就是说Derive就匹配到Derive的,Base匹配到Base,正常操作。
情况3 virtual重写+默认参数
class Base
{
public:
virtual void print(int a) { cout << "Base Sub's way: a = " << a << endl; }
};
class Derive:public Base
{
public:
virtual void print(int a, int b=1) {cout << "Derive Sub's way: a = " << a << ", b = " << b << endl;}
};
结果
Derive Sub’s way: a = 1, b = 1 Base Sub’s way: a = 1
这是一个比较迷惑的做法,因为同时存在virtual、重写和默认参数, Derive那个肯定是调用Derive的,关键是Base指针的调用。
- 可能一:
因为virtual,所以应该调用Derive的print。 - 可能二:
因为重写,所以可能匹配到Base或者Derive的priint。 - 可能三:
因为使用默认参数,所以可能匹配到Base和Derive的print。
有太多的可能指向应该调用Derive的print了,然而调用的却是Base的print。(即使把基类的参数换成 float 也一样) 我们先看下情况4再说。
情况4 最平常的运行时多态
class Base
{
public:
virtual void print(int a) { cout << "Base Sub's way: a = " << a << endl; }
};
class Derive:public Base
{
public:
virtual void print(int a) {cout << "Derive Sub's way: a = " << a << endl;}
};
};
结果
Derive Sub’s way: a = 1 Derive Sub’s way: a = 1
这就是普通的运行时多态了。
回到情况三,我们应该可以理解了,如果是Base调用virtual函数,在被Derive的virtual重写给改了参数个数和格式后,Base的调用会优先对应父类中对的。
总之我感觉我理解得还不到位,先这样吧。
|