现在的位置: 首页 > 综合 > 正文

C++中继承的成员变量的覆盖/重写

2013年08月04日 ⁄ 综合 ⁄ 共 767字 ⁄ 字号 评论关闭

首先需要明白:

(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();此时,ABm的值为12bB类中寻找print函数,发现不存在,继而去其直接父类中寻找,输出b.m,那么这个m到底是类A中的还是类B中成员函数呢?当然是类A中的成员变量,这是为什么呢?

           看看《C++ Primer》怎么说的?

 

抱歉!评论已关闭.