我应该通过什么方式访问这个父方法和父变量?
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 );
}
};
谢谢。
编辑:如果有歧义怎么办?
最佳答案
您在代码中使用的两种语法(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);
}
解决歧义。
但是,同样,在您的具体示例中,没有歧义,也没有隐藏所有这些的名称,这完全没有必要。
关于C++:访问父方法和变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4523545/