首先需要明白:
(1) 成员函数的覆盖:子类对父类的成员函数覆盖,必须函数名称一致,参数一致,返回值一致(当然编译器决定);
(2) 成员变量的覆盖:子类覆盖的仅仅是继承来的那个成员变量,而并不改变原来父类中的变量;
(3) 构造函数从基类开始构造,各个类的同名变量没有形成覆盖,都是单独的变量。子类调用就近原则,如果父类存在相关接口则优先调用,如果父类不存在则调用祖父类接口;当然,如果自己有则首先调用自己的函数;
我们先来看一段程序:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
int m;
A() { m=1; printf("A.m=%d\n",this->m); }
void print() { printf("%d\n",this->m); }
};
class B:public A
{
public:
int m;
B() { m=2; printf("B.m=%d\n",this->m);}
};
int _tmain(int argc, _TCHAR* argv[])
{
B b;
b.print();
printf("%d\n",b.m);
return 0;
}
///====================================输出
A.m=1
B.m=2
1
2
也就是说,程序在调用过程中,先构造的是基类,将A中的m置为1,然后构造子类,将B中的m置为2;接下来调用b.print();此时,A、B中m的值为1、2,b在B类中寻找print函数,发现不存在,继而去其直接父类中寻找,输出b.m,那么这个m到底是类A中的还是类B中成员函数呢?当然是类A中的成员变量,这是为什么呢?
看看《C++ Primer》怎么说的?