基类派生类的同名成员变量覆盖问题

#include <iostream>
using namespace std;

class A {
public:
int a;
A(int aa = 1) { a = aa;}
void print() {
cout<<a<<endl;
}
};

class B: public A {
public:
int a;
B( int bb = 2 ) { a = bb; }

};

int main() {
B tp;
tp.print();
cout<<tp.a<<endl;
return 0;
}

如上代码,输出结果是1 2.
这段代码应该怎么理解?

我目前的理解是这样:内存中存着两个a,基类的和派生类的。当调用创建的是派生类,所以当输出tp.a,就是派生类的a。当条用print函数时,因为调用的是基类的函数,所以输出的就是基类的a。否则派生类的a覆盖了基类的a。
这样理解对吗?求分析这段代码

你的理解基本很对了。基类的那个print只能访问基类的 a,访问不到派生类的 a的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-02-26
是这个意思,可以再看看虚函数的相关内容可能能理解更深刻一些。
http://www.cnblogs.com/CaiNiaoZJ/archive/2011/08/11/2134673.html本回答被提问者采纳

C++:继承中的同名覆盖原则是什么意思?
当派生类与基类有相同成员时,例如:有一个基类Class A, A类里有个成员函数 int fun(),类B继承了类A,类B也有个成员函数,int fun(),在实现部分里,在调用下函数fun()下,由于基类和派生类的函数名一样,系统无法按原则(原则:先基类,然后对象,最后派生类)调用,就覆盖了。

什么情况下是重载,什么情况下是重写,什么情况下是覆盖
重载,是在相同的作用域中,如果具有相同名字而形参表不同的函数,则成为重载。重载(overload)不是根据返回值判断,如果仅仅是返回值不同的两个函数,则视为函数的重复声明。编译出错。覆盖(override):指的是派生类覆盖基类函数,特征是:不同的范围(分别位于派生类与基类),函数名字相同 参数相同...

C++ 派生类对基类成员的重定义和名字隐藏 是怎么回事啊?
看《C++对象模型》 里面有CPP的实现细节

C#在派生类中定义与基类中同名的方法那几种可能的情况是?
1。override:在基类中定义virtual 方法,在派生类中使用override表示覆盖。2。new:在派生类中使用new修饰关键字(new是默认的,所以你不加new的话,默认你覆盖同名方法,但是在编译的时候会产生一个Warning);两者的区别在于将派生类转化为基类的时候,调用同名函数,结果真正调用的是不同的。

什么是覆盖?
参数不同;覆盖:不同的范围(分别位于派生类和基类);函数名字相同;参数相同;基类函数必须有virtual函数。隐藏:如果派生类的函数与基类函数同名,但是参数不同,基类的函数将被隐藏。如果派生类的函数与基类函数同名,而且参数相同,但是基类的函数没有virtual关键字,则基类的函数被隐藏。

基类和子类函数名相同且参数类型一样,基类函数如何被覆盖,还存在吗?存 ...
基类加上virtual关键字就能够被覆盖~基类当然是存在的,只不过变成了虚函数,作为一个可以被类似于模型的东西存在。与他相似的子类在调用时,自动覆盖基类版本。就相当于调用子类的同时已经调用了基类,但是只占用子类的空间~

关于C++中的二义性
即派生类中的函数遮挡住基类中的同名函数,这并不是所谓的二义性,其实两个函数都存在,只是编译器发现当前作用域内的函数名时,就停止了 进一步向外层作用域搜索。想调用基类的函数,可以前边加上类名,如此例中d.C::a()或d.A::a()在实际应用中,这种情况是应该避免的,一般覆盖(override)的...

求解此Java题解析?怎么看?
这个问题考的是Java的继承和多态性。以下语句 A b = new B();在执行的时候,同名变量是基类A的变量覆盖派生类B的变量,会类B方法会覆盖同名同参数的类A方法。所以以上语句执行A的赋值,B的f函数(同名重写)。学习编程最好的方法是实验。可以用以下代码测试:\/* * To change this license header...

是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual...
只要基类在定义成员函数时已经声明了virtue关键字,在派生类实现的时候覆盖该函数时,virtue关键字可加可不加,不影响多态的实现。容易与隐藏混淆:隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下:1) 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数...

C++:区别覆盖,重载与多态
这样解释一下吧:覆盖:在基类中定义了一个非虚拟函数,然后在派生类中又定义了一个同名同参数同返回类型的函数,这就是覆盖了。在派生类对象上直接调用这个函数名,只会调用派生类中的那个。重载:在基类中定义了一个非虚拟函数,然后在派生类中定义一个同名,但是具有不同的参数表的函数,这就是重载...

相似回答