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++三种继承方式下的访问权限控制

众所周知,C++类中的成员(函数/变量)拥有三种访问权限:        public:用该关键字修饰的成员表示公有成员,该成员不仅可以在类内可以被访问,在类外也是可以被访问的,是类对外提供的可访问接...

C++继承时子类定义同名成员变量时的调用继承函数的问题

代码如下: C/C++ code #includeiostream.h> class Base { public: int a; Base() ...
  • zhubo22
  • zhubo22
  • 2012年09月17日 15:28
  • 10148

基类的protected成员变量只能被子类继承,在基类之外都不能直接访问基类protected成员变量

class Base { public: Base() {} ~Base() {} void setI(int a) {i = a;} int getI() {return i;} prote...

C++的三种访问权限与三种继承方式

三种访问权限我们知道C++中的类,有三种访问权限(也称作访问控制),它们分别是public、protected、private。要理解它们其实也很容易,看下面了一个例子。 父类:class Pers...
  • luoweifu
  • luoweifu
  • 2015年07月19日 11:10
  • 10091

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

类的继承以及对象的赋值会带来成员变量的相互传递。这里详细讨论了,类间继承带来的成员变量的传递采用覆盖原则,采用函数级的成员变量的取值;对象赋值带来的成员变量的传递采用,实函数采用数据类型的实函数,虚函...

C++ public继承后,子类能改变父类的成员变量吗?

看下面例子: #include using namespace std; class Aclass { public: int m_Anum; public: Aclass(){m_Anum ...

C++面向对象—成员函数与成员变量的实现机制学习笔记(1)

《深度搜索C++对象模型》的一些学习纪要: 一成员变量篇 0. 类的编译中,先编译成员变量和成员函数的额声明,成员函数的定义在类声明结束后再处理; 1. 类中,多个代码区块public或者pri...
  • ordeder
  • ordeder
  • 2014年05月20日 21:03
  • 1410

MONGODB 与sql聚合操作对应图

SQL Terms, Functions, and Concepts                                       MongoDB Aggregation Op...
  • miyatang
  • miyatang
  • 2014年03月11日 10:25
  • 14042

C++中父类成员变量和子类成员变量重复定义及访问方法的深入探究

在用C++做工程时,继承是C++最常用的特性之一,因为它会使得工程复用性很高。但是现在存在一个问题,例如我们在使用MFC库时,往往会去继承库里面的一个类,但是我们并不去看父类里面的实现代码,所以在定义...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++继承中成员变量关系及访问方法的深入探究
举报原因:
原因补充:

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