13

我应该以哪种方式访问​​这个父方法和父变量?

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 );
    }
};

谢谢。

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

4

3 回答 3

13

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

当没有歧义或其他问题时,您不需要任何这些语法。您只需要一个简单的非限定名称,就像Write您的示例中一样。只是Write,不是this->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->mWords方法不会帮助您取消隐藏专有名称,您必须使用限定名称来解决问题

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

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

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

class Foundation {
public:
  int mWords;
  ...

那么名字就会模棱两可Child::DoSomethingmWords你必须这样做

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

来解决歧义。


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

于 2010-12-24T01:33:35.763 回答
0

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

Write(mWords);

除非你遇到歧义。

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

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

我想一种看待它的方法是使用第一个有效的方法并做你想做的事:

  1. name
  2. this->name
  3. Base::name
于 2010-12-24T00:52:56.660 回答
0

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

于 2010-12-24T00:54:04.257 回答