我应该以哪种方式访问这个父方法和父变量?
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);
}
解决歧义.
但是,在你的具体例子中,没有歧义,没有名字隐藏,所有这一切是完全不必要的.