首页 > 试题广场 >

有以下程序 #include &...

[单选题]
有以下程序
#include<iostream>
using namespace std;
class Point {
public:
        Point(float xx=0, float yy=0) {X=xx;Y=yy;}
        float GetX() {return X;}
private:
    float X,Y;
};

class Rectangle: private Point {
public:
    Rectangle(float x, float y, float w, float h):Point(x,y) {W=w;H=h;}
    float GetX() {return ___________;}
    float GetH() {return H;}
    float GetW() {return W;}
private:
    float W,H;};

int main() {  
    Rectangle r(1,2,3,4);
    cout<<r.GetX();
    return 0;
}
请为横线处选择合适的程序使得程序的运行结果是1(      )?
  • Y
  • Point::GetX()
  • GetX()
  • X
这题这么顶,果断收藏了
发表于 2020-05-24 23:02:35 回复(0)
<p>坑有点多,首先是私有继承,基类所有保护和公有继承为派生类私有,基类私有成员,也就是这里X,Y不可访问;其次这里point的getX是可以访问的,但是派生类内部又有个重名的getX,这会产生二义性,所以要访问基类的getX,要加上作用域point::getX</p>
发表于 2020-09-06 10:56:31 回复(0)
xcn头像 xcn
私有成员调用,需要加上该私有成员的的归属类
发表于 2019-11-10 10:10:31 回复(2)
有哪位大佬能详细说明吗?
发表于 2020-05-19 08:23:30 回复(1)
私有继承,基类所有保护和公有继承为派生类私有,基类私有成员x Y不可访问,这里point的getX是可以访问的,但是派生类内部又有个重名的get X,会产生二义性,故要加上作用域
发表于 2022-02-17 14:56:03 回复(0)
注意,派生类Rectangle中,其构造函数中的形参x和y是小写的,与X和Y是不同的。
因此要返回1,就必须调用基类的GetX()函数。
而基类的GetX()函数其返回值X是私有成员,因此需要加上归属类,即Point::GetX()。
发表于 2020-07-10 18:14:15 回复(0)
注意X是Point的私有成员变量
发表于 2019-08-19 16:29:01 回复(0)
因为Rectangle类中也有GetX()函数,虽然Point中的GetX()是public函数,但是如果在子类中直接写GetX()函数会导致编译器调用子类自己的GetX()函数。

发表于 2022-12-22 20:10:02 回复(0)
因为父子类存在同名的函数。所以在调用父类的函数中,要加上类名,避免二义性
发表于 2021-02-20 20:35:06 回复(0)
如果不加Point:: 
那代码肯定有二义性,因为这也可以看成是一个递归函数
发表于 2019-10-18 21:35:20 回复(0)
主要考察二义性的相关知识,加域解析符即可
发表于 2023-04-19 13:47:12 回复(0)
指明调用哪个类的重名方法。在多重继承里面,两个基类有相同的成员函数名字,在继承的时候,可以使用类似方法重写一下。
发表于 2020-08-18 00:19:10 回复(0)
本题知识点为啥这么强 
发表于 2020-03-10 15:52:09 回复(0)