c++解决二义性的方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++解决二义性的方法相关的知识,希望对你有一定的参考价值。
解决类继承中产生的二义性的方法不包括
A)使用作用域运算符限定访问的成员函数
B)在派生类中定义同名函数,且参数表必须和基类的保持一致
C)在派生类中定义同名函数,且参数表可以和基类的不同
D)采用虚基类解决多重继承中的共同基类产生的二义性
请解释一下
初看题目,答案应该在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++解决二义性的方法的主要内容,如果未能解决你的问题,请参考以下文章