c++解决二义性的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++解决二义性的方法相关的知识,希望对你有一定的参考价值。

解决类继承中产生的二义性的方法不包括
  A)使用作用域运算符限定访问的成员函数
  B)在派生类中定义同名函数,且参数表必须和基类的保持一致
  C)在派生类中定义同名函数,且参数表可以和基类的不同
  D)采用虚基类解决多重继承中的共同基类产生的二义性
请解释一下

B.
初看题目,答案应该在BC之间.
我就只解释错误的了.
假设:
基类中有方法void Cool(int i)
派生类中也有方法void Cool(int i)
实际运行中派生类的Cool方法会覆盖基类中的同名方法.
因为基类的Cool方法并没有消失,仍然可以通过其他途径调用.
所以,这样编写代码时很容易造成混淆(二义性).
参考技术A 同意B
如:
class A

public:
void display(int i)e1

class B : public A

public:
void display(int j)e2

void main()

B b;
b.display(2);

请问到底是调用A中的display,还是B中的呢?
这就产生二义性了!
参考技术B 解决方法:
法一 、类名限定:
调用时指名调用的是哪个类的函数,如:
c1.A::f();
c1.B::f();
法二、 同名覆盖:
在C中声明一个同名函数,该函数根据需要内部调用A的f或者是B的f。如:
class C:public A,public B
public:
void g();
void h();
void f()
A::f();

;
法三、虚基类(用于有共同基类的场合):
virtual 修饰说明基类,如:
class B1:virtual public B

C++ 类的继承五(多继承的二义性--虚基类)

//多继承的二义性--虚基类(了解为主)
#include<iostream>
using namespace std;

/*
多继承在现在的项目开发中一般不使用,他会增加项目的复杂度
*/

class Point{
public:
    Point(){
        x = 1;
        y = 1;
    }
    int x;
    int y;
};

class PointA :virtual public Point{
public:
    PointA(){
        a = 2;
    }
    int a;
};

class PointB :virtual public Point{
public:
    PointB(){
        b = 3;
    }
    int b;
};

class PointC :public PointA, public PointB{

};

void ProtectA(){
    PointC pc1;
    //pc1.x = 1;   报错  error C2385 : 对“x”的访问不明确
    //这时候我们可以使用 virtual关键字修饰继承关系
    pc1.y = 2;
    //virtual关键字可以检测出PointA和PointB都是从Point继承,所以pc1.y = 2;是给Point类对象赋值
}

void main(){
    ProtectA();
    system("pause");
}

 

以上是关于c++解决二义性的方法的主要内容,如果未能解决你的问题,请参考以下文章

深度探索C++关键字之 virtual

深度探索C++关键字之 virtual

C++二义性问题之Most Vexing Parse

C++二义性问题之Most Vexing Parse

解决二义性!

C++继承(下)