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

时间:2010-12-24 00:45:52

标签: 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 );
    }
};

感谢。

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

3 个答案:

答案 0 :(得分:11)

您在代码中使用的两种语法(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::DoSomething中,mWords名称将不明确,您必须这样做

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

解决歧义。


但是,再一次,在你的具体例子中,没有歧义,没有名字隐藏所有这些都是完全没必要的。

答案 1 :(得分:0)

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

Write(mWords);

除非你遇到歧义。

如果存在歧义或阴影,因为你想要(特定)基类中的某些东西但是另一个基类(或这个类)中的东西隐藏它,那么使用Base::name语法。

如果局部变量正在影响您的某个成员,那么请使用this->,但通常您应该尝试避免这种情况。 (即:尽量避免命名本地人,使他们影响成员)

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

  1. name
  2. this->name
  3. Base::name

答案 2 :(得分:0)

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