【问题标题】:c++ same name member in parent and child classc++父子类同名成员
【发布时间】:2018-12-13 12:00:15
【问题描述】:

如果在c++ 中父子类有一个同名成员,我在c++ 编程中遇到了问题:

#include <iostream>
using namespace std;

class A{
private:
    int x;
public:
    A(){x=1;}
    void SetX(int i)
    {
        x=i;
    }

};

class B:public A{
private:
    int x;
public:
    B(){}
   int GetX()
    {
        return x;
    }
};
int main() {
    B b;
    cout<<b.GetX()<<endl;
    b.SetX(10);
    cout<<b.GetX()<<endl;
    return 0;
}

程序结果是:

-858993460
-858993460

为什么?返回的是哪个x
感谢您的帮助。

【问题讨论】:

  • 可以将其用于学习目的(请参阅当前答案),但这里真正的教训是“永远不要让自己陷入这种情况”:避免在基类和派生类中使用 2 个同名变量,这只会产生误导,而且很容易出错
  • 我知道。这是我们老师给的程序。

标签: c++


【解决方案1】:

在 C++ 中,子类中的符号被定义为“隐藏”父类中的任何同名符号。这样代码所指的符号就不会模棱两可了。请注意,这是不可取的,因为您的代码显示的正是混乱!

有关键字using,可以将某些父类符号“提升”到子类中。但同样,在这种情况下这是不可取的!

查看Overloading method in base class, with member variable as default 以获取using 的示例。

【讨论】:

  • 我觉得官方的说法是跟风
  • @JVApen 是的,但这个词本身会引起混淆,所以我使用“隐藏”(引号)。我发现对许多人来说,“遮蔽”的概念是“跟随”而不是“置身于阴影中”,所以...
【解决方案2】:

B::GetX 将始终返回 B::x

A::SetX 将始终设置为A::x

由于B::x 从未被初始化,它的值将是indeterminate,打印它会导致undefined behavior

【讨论】:

  • 实际上,B::x 是唯一在 OP 代码中初始化的 x。你是说 A::X 吗?
  • @GianPaolo B 构造函数从不初始化B::x,并且对象b 不是以任何方式初始化的值或零。另一方面,A 构造函数分配给A::x
  • 我们如何知道函数使用了哪个 x?
  • @501 最近的作用域...在B 类中,最近的作用域在B 类中,你有B::xB::x 隐藏 A::x,无论如何都是privateB 无法访问。而在A 类中,它甚至不知道B 或其成员的任何信息,因为继承是​​单向 关系。
  • @Someprogrammerdude 对,我错过了 A ctor 中的 A::x 初始化,只考虑了 b.SetX,它实际上是在第一次 b.GetX 调用 (UB) 之后调用的
猜你喜欢
  • 2011-11-03
  • 2012-07-16
  • 1970-01-01
  • 2011-02-07
  • 2013-04-11
  • 2015-04-12
  • 1970-01-01
  • 2022-11-01
  • 2014-07-13
相关资源
最近更新 更多