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::DoSomething该mWords名称将是明确的,并且你必须做
DoSomething(int mWords) {
Write(Foundation::mWords);
}
Run Code Online (Sandbox Code Playgroud)
解决歧义.
但是,再次,在您的具体示例中,没有歧义且没有名称隐藏,所有这些都是完全没必要的.