我应该以哪种方式访问这个父方法和父变量?
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 ); } };
谢谢.
编辑:如果有歧义怎么办?
解决方法
您的代码中使用的两种语法(此 – > …和限定名称)仅在存在歧义或某些其他名称查找问题(如名称隐藏,模板基类等)时才有必要.
当没有歧义或其他问题时,您不需要任何这些语法.所有你需要的是一个简单的不合格的名字,如写在你的例子.只是写,而不是写 – 而不是基础::写.同样适用于mWords.
即在你的具体例子中,一个简单的写(mWords)将工作正常.
为了说明上述,如果您的DoSomething方法具有mWords参数,如in
DoSomething(int mWords) { ...
那么这个本地的mWords参数将隐藏继承的类成员mWords,你也必须使用它们
DoSomething(int mWords) { Write(this->mWords); }
要么
DoSomething(int mWords) { Write(Foundation::mWords); }
表达你的意图,即突破隐藏.
如果你的孩子班也有自己的mWords成员,如同
class Child : public Base,public Foundation { int mWords ...
那么这个名字就会隐藏继承的mWords.在这种情况下,这种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); }
解决歧义.
但是,在你的具体例子中,没有歧义,没有名字隐藏,所有这一切是完全不必要的.