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

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值