C/C++日常学习总结(第三篇)不能重载的运算符和不同基类继承产生的二义性

来源:互联网 发布:淘宝店家开通花呗条件 编辑:程序博客网 时间:2024/05/20 12:23
#include<iostream>using namespace std;

1.全局变量和局部变量能不能重名?

【代码】

int  index = 100;void main(){     int index = 200;     cout<<"index="<<index<<endl;     cout<<"全局 index<span style="color:#ff0000;">="<<::index</span><<endl;}


 

 【解析】:

运行上面程序,得到的结果是:index=200     全局index=100;

这两个变量有各自的存储区域,全局变量放在数值存储区,而函数内部的变量是放在栈上,只要加上一个全局的域名操作符就可以访问到同名的全局变量。

 

2.不能重载的运算符有哪些?

【解析】:

(1.)成员访问符.

(2.)成员指针访问运算符.*

(3.)域运算符::

(4.)长度运算符sizeof()

(5.)条件运算符?:

 

3.3种派生方式下的访问权限

【解析】:

4.派生类生成过程包含3个步骤:
 (1.)吸收基类的成员
 (2.)改造基类的成员
 (3.)添加新的成员

 

5.不同基类继承产生的二义性及解决办法。

#include<iostream>using namespace std;class A{ public:         void  print()          {             cout<<"hello this is A"<<endl;          }};class B{ public:         void  print()          {             cout<<"hello this is B"<<endl;          }};class C:public A,public B{ public:         void  display()          {            print();          }};void main(){     A a;     a.print();     B b;     b.print();     C c;     c.print();     c.display();}


【解析】:

上面的程序,是不同的基类里面有相同的成员函数,共同派生的派生类C,他是不清楚究竟调用哪个,所以产生了不同基类继承的二义性。

解决办法:

 C c;

 (1.) c.A::print();//c.B::print();加上类名,告诉程序你想调用哪个成员函数

 (2.)重写类C中的display()函数,可以在C类中加上一个成员函数,比如

private:BOOL     m_bChose;public:C(BOOL b=TRUE):m_bChose(b){}void display(){         if(m_bChose){          A::print();      }else{          B::print();      }}

在定义C对象时指明值,C c(false);

c.display();//这个时候输出的就是hello this is B

 

0 0
原创粉丝点击