C++:访问父方法和变量

11 c++ inheritance parent-child base-class

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

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 );
    }
};
Run Code Online (Sandbox Code Playgroud)

谢谢.

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

AnT*_*AnT 11

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

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

即在你的具体例子中,普通Write( mWords )将工作得很好.


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

DoSomething(int mWords) {
  ...
Run Code Online (Sandbox Code Playgroud)

然后这个本地mWords参数将隐藏继承的类成员mWords,你必须使用其中任何一个

DoSomething(int mWords) {
  Write(this->mWords);
}
Run Code Online (Sandbox Code Playgroud)

要么

DoSomething(int mWords) {
  Write(Foundation::mWords);
}
Run Code Online (Sandbox Code Playgroud)

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


如果你的Child班级也有自己的mWords成员,如

class Child : public Base, public Foundation
{
  int mWords
  ...
Run Code Online (Sandbox Code Playgroud)

那么这个名字就会隐藏继承的名字mWords.this->mWords在这种情况下的方法不会帮助你取消隐藏正确的名称,你必须使用限定名称来解决问题

DoSomething(int mWords) {
  Write(Foundation::mWords);
}
Run Code Online (Sandbox Code Playgroud)

如果你的两个基类都有一个mWords成员,就像在

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

class Foundation {
public:
  int mWords;
  ...
Run Code Online (Sandbox Code Playgroud)

然后在Child::DoSomethingmWords名称将是明确的,并且你必须做

DoSomething(int mWords) {
  Write(Foundation::mWords);
}
Run Code Online (Sandbox Code Playgroud)

解决歧义.


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