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

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

谢谢。

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

最佳答案

您在代码中使用的两种语法(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/

相关文章:

sql - 从表中获取所有子节点

C Minishell - 管道实现需要杀僵尸

c++ - 在文件中找到字符串后替换它旁边的字符

c++ - 指向具有显式构造函数的对象的指针

c++ - 在巨大的日志文件中搜索数百种模式

c++ - 如何与 USB 扫描仪通信?

C++ 继承和成员访问问题

java - 扩展通用类

java - 如何通过反射获取继承的参数化字段类?

c - 我如何一次最多 fork 父进程的 5 个子进程?