C++继承中成员变量关系及访问方法的深入探究

原创 2016年05月31日 10:11:20
在用C++做工程时,继承是C++最常用的特性之一,因为它会使得工程复用性很高。但是现在存在一个问题,例如我们在使用MFC库时,往往会去继承库里面的一个类,但是我们并不去看父类里面的实现代码,所以在定义成员变量的时候可能会和父类里面的成员变量一样。但是这样会产生什么后果我们基本不怎么去关心,因为很多人都觉的无关紧要,都只是想着定义就行,并没有过关心它的原理及根本的东西。今天就来说说出现这样的问题会不会对程序产生影响。首先先看一段代码。
#include <iostream>

using namespace std;

// 定义了一个 Parent 类型的父类,里面有 i、j 两个成员变量(protected 表示成员变量只能在父类子类中被访问)
class Parent
{
 protected:
 int i;
 int j;
};

// 定义一个子类 Child,它共有继承了 Parent 类,里面有一个和父类一样的成员变量 i 
class Child : public Parent
{
protected:
 int i;
 // f()函数的作用是打印 当前父子类中的 i、j
 void f()
 {
  cout << "Parent::i = " << Parent::i << endl;
  cout << "Child::i = " << Child::i << endl;
  cout << "Parent::j = " << Parent::j << endl;
  
 }

public :
 // 子类的构造函数 
 Child(int i, int j)
 {
  Parent::i = i;       // 把父类中的 i 赋值为参数 i

  Child::i = j;        // 把子类中的 i 赋值为参数 i

  Parent::j = i + j;   // 把父类中的 j 赋值为参数 j
  
  f();                 // 条用 f() 函数
 }
}; 

int main()
{
 // 定义一个 Child 类型的对象,参数为 1, 2  
 Child c1(1, 3);

 return 0;
}


上面的程序打印结果为

Parent::i = 1
Child::i = 3
Parent::j = 4

 

毫无疑问,我们可以使用 “::” 作用域分辨符来区分子类和父类中的相同的成员变量,但是往往我们在类中访问成员变量时基本没有用过作用域分辨符,究竟在不使用的情况下会发生怎样的情况呢?下面我们来在看一段代码

 

 

 

#include <iostream>


using namespace std;


// 定义了一个
class Parent
{
protected:
int i;
int j;
};


class Child : public Parent
{
protected:
int i;
int j;
void f()
{
cout << "Parent::i = " << Parent::i << endl;
cout << "Parent::j = " << Parent::j << endl;
cout << "Child::i = " << Child::i << endl;
cout << "Child::j = " << Child::j << endl;
}


public :
Child(int a, int b)
{
i = a;
j = b;

f();
}
}; 


int main()
{
Child c1(1, 3);
return 0;
}


 

 

运行结果为

 

Parent::i = -858993460
Parent::j = -858993460
Child::i = 1
Child::j = 3

 

所以默认如果不用作用域分辨符的话,编译器会使用本类中定义的那个变量

 

例如:i = a;j = b

 

这里的赋值代表就是 

Child::i 和 

Child::j 。如果真的要操作父类的 i、j那么就需要作用域分辨符“::”来确定。所以我们在定义变量的时候即使和父类同名也没关系,不会对程序造成影响,因为我们一般在类里面定义的成员变量本意都是在本类中使用

 

总结:当子类中有和父类一样名字的成员变量,在子类使用此变量时,当不使用作用域分辨符时,默认会使用子类的变量。

可以这样理解:当在类里面访问成员变量时,先看看自己有没有,自己有就直接用,如果自己没有,那么看老爸(父类)有没有,父类如果有就用父类的(前提这个变量在父类要是protected或者public,如果在父类这个成员变量是private,这个成员变量继承给子类,子类里面照样是不可访问的),父类如果没有程序就会报错。


所以我们在程序设计时,如果子类和父类出现两份一模一样的成员变量,要访问父类中的变量,必须使用作用域分辨符,如果不想使用作用域分辨符,那就在设计类的时候让两个名字不要冲突。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++ 类继承与对象赋值 情况下 成员变量的覆盖 浅析

类的继承以及对象的赋值会带来成员变量的相互传递。这里详细讨论了,类间继承带来的成员变量的传递采用覆盖原则,采用函数级的成员变量的取值;对象赋值带来的成员变量的传递采用,实函数采用数据类型的实函数,虚函...
  • u013630349
  • u013630349
  • 2015年07月02日 10:13
  • 1676

C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制

zz: http://blog.sina.com.cn/s/blog_b35e31b90101b6y7.html 为了防止连接失效,所以直接转过来备份了! 很多同学到现在仍然对访问权限不是很清楚,...
  • temanIU
  • temanIU
  • 2016年02月26日 16:21
  • 1412

父类私有变量是否被子类继承详细解说(答案:内存中存在,但sun公司定义为不继承)

因为网上就父类私有属性是否被子类继承一直争论不休,以下为了解释清楚,本人做了大量详细说明,请不要嫌我啰嗦,都是基础的知识,认真看完你会明白的。 class Parent{//父类     priv...
  • Mr_duantao
  • Mr_duantao
  • 2016年03月23日 20:46
  • 1750

C++:私有继承

C++:私有继承标签(空格分隔): c++C私有继承 私有继承 初始化基类组件 访问基类方法 访问基类对象 访问基类友元函数 应该使用包含还是继承 保护继承 重新定义访问权限 各种继承方式的比较 公...
  • qq_32583189
  • qq_32583189
  • 2016年09月08日 10:49
  • 878

C++ 公有继承、保护继承、私有继承的区别

1)基类成员对派生类的可见性 1. 公有继承(public) :基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访...
  • chlele0105
  • chlele0105
  • 2014年03月28日 17:05
  • 1526

Java:子类能够继承父类的私有变量和私有方法?

JAVA中私有变量能否被继承? 最近在看OCJP的题库,看到有部分题就是在考察多态中的继承相关, 在CSDN论坛上相关大家说法也是众多纷纭,下面简单例子说明相关关系 public class Tes...
  • dietime1943
  • dietime1943
  • 2016年10月25日 19:45
  • 5104

C++继承类型:公有、保护、私有、虚拟

公有继承(public)、保护继承(protected)、私有继承(private)是常用的三种继承方式,除了这些继承类型外还有一种虚拟继承。...
  • shihengzhen101
  • shihengzhen101
  • 2015年11月22日 18:57
  • 662

Python学习笔记--类简介,继承,私有成员

Python中也有类的概念,且与所有面向对象语言类似(更类似于java,而不是C++),只是没有public, private, protected关键字。Python使用自己的方法支持这些关键字的功...
  • u010085454
  • u010085454
  • 2013年07月31日 01:58
  • 2862

C++ 类继承与对象赋值 情况下 成员变量的覆盖 浅析

类的继承以及对象的赋值会带来成员变量的相互传递。这里详细讨论了,类间继承带来的成员变量的传递采用覆盖原则,采用函数级的成员变量的取值;对象赋值带来的成员变量的传递采用,实函数采用数据类型的实函数,虚函...
  • u013630349
  • u013630349
  • 2015年07月02日 10:13
  • 1676

C++中基类私有成员会被继承吗

1.派生类间接访问继承私有成员在类的继承中,类的私有成员在派生类中是“不可见“的,这种”不可见“是指在派生类的成员函数中,或者通过派生类的对象(指针,引用)不能直接访问它们。但是,不能直接访问并不代表...
  • K346K346
  • K346K346
  • 2015年11月05日 00:51
  • 5364
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++继承中成员变量关系及访问方法的深入探究
举报原因:
原因补充:

(最多只允许输入30个字)