【问题标题】:C++: Accessing parent methods and variablesC++:访问父方法和变量
【发布时间】:2011-05-30 05:48:07
【问题描述】:

我应该通过什么方式访问这个父方法和父变量?

class Base
{
public:
    std::string mWords;
    Base() { mWords = "blahblahblah" }
};

class Foundation
{
public:
    Write( std::string text )
    {
        std::cout << text;
    }
};

class Child : public Base, public Foundation
{
    DoSomething()
    {
        this->Write( this->mWords );
        // or
        Foundation::Write( Base::mWords );
    }
};

谢谢。

编辑:如果有歧义怎么办?

【问题讨论】:

    标签: c++ inheritance parent-child base-class


    【解决方案1】:

    我认为这是最常见的方法:

    Write(mWords);
    

    除非你遇到歧义。

    如果由于您想要某个(特定)基类中的某些内容而存在歧义或阴影,但另一个基类(或此类)中的某些内容将其隐藏,请使用 Base::name 语法。

    如果局部变量影响了您的成员之一,则使用this-&gt;,但通常您应该尽量避免这种情况。 (即:尽量避免命名本地人,以免他们影响成员)

    我想一种看待它的方法是使用其中的第一个,它可以工作并做你想做的事:

    1. name
    2. this-&gt;name
    3. Base::name

    【讨论】:

    • 是的,我可能不得不处理模棱两可的问题......我会在我原来的帖子中澄清。
    【解决方案2】:

    由于没有命名冲突,只需使用Write(mWords)。如果局部变量有冲突,或者名称被隐藏,请使用其他 2 个。

    【讨论】:

    • 如果有冲突,您推荐我使用哪种方法?
    • “当名字被隐藏时”是什么意思?
    • 如果是局部变量和成员变量之间的冲突(例如,你的类有一个成员变量i,而你的方法也使用了一个局部变量i),使用this。如果A声明了一个函数f,而B继承了A并声明了f,并且你想从B调用Af,那么使用A::f
    【解决方案3】:

    您在代码中使用的两种语法(this-&gt;... 和限定名称)仅在存在歧义或其他名称查找问题时才需要,例如名称隐藏、模板基类等。

    当没有歧义或其他问题时,您不需要任何这些语法。您只需要一个简单的非限定名称,例如您的示例中的Write。只是Write,不是this-&gt;Write,也不是Foundation::Write。这同样适用于mWords

    即在您的具体示例中,普通的 Write( mWords ) 可以正常工作。


    为了说明上述情况,如果您的DoSomething 方法有mWords 参数,如

    DoSomething(int mWords) {
      ...
    

    那么这个本地 mWords 参数将隐藏继承的类成员 mWords 并且您必须使用其中一个

    DoSomething(int mWords) {
      Write(this->mWords);
    }
    

    DoSomething(int mWords) {
      Write(Foundation::mWords);
    }
    

    正确表达你的意图,即突破隐藏。


    如果您的Child 类也有自己的mWords 成员,如

    class Child : public Base, public Foundation
    {
      int mWords
      ...
    

    那么这个名字将隐藏继承的mWords。在这种情况下,this-&gt;mWords 方法无法帮助您取消隐藏专有名称,您必须使用限定名称来解决问题

    DoSomething(int mWords) {
      Write(Foundation::mWords);
    }
    

    如果您的两个基类都有 mWords 成员,如

    class Base {
    public:
      std::string mWords;
      ...
    };
    
    class Foundation {
    public:
      int mWords;
      ...
    

    那么在Child::DoSomething 中,mWords 的名称将是模棱两可的,您必须这样做

    DoSomething(int mWords) {
      Write(Foundation::mWords);
    }
    

    解决歧义。


    但是,再一次,在您的具体示例中,没有歧义并且没有隐藏所有这些的名称是完全没有必要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      相关资源
      最近更新 更多