【问题标题】:difference between inherited and own variables of classes类的继承变量和自有变量之间的区别
【发布时间】:2014-07-31 15:26:39
【问题描述】:

有人可以解释一下类的自身变量和继承变量之间的区别吗? 例如在这段代码中:

class First
{
public:
    int test;

    First::First()
    {
        test = 5;
    }
};

class Second : public First
{
public:
    void setTest(int test)
    {
        Second::test = test;
    }
    int Second::GetTestFirst()
    {
        return First::test;
    }
    int Second::GetTestSecond()
    {
        return Second::test;
    }
};
int main()
{
    int input;
    Second * sec = new Second;
    cin >> input;
    sec->setTest(input);   //for example 15
    std::cout << sec->GetTestFirst();
    std::cout << sec->GetTestSecond();
    return 0;
}

GetTestFirst() 和 GetTestSecond() 的输出有什么区别?它指向同一个内存块吗?如果是同样的东西,哪个更好用?

【问题讨论】:

  • 类中的合格成员定义无效且毫无意义。不要。
  • 只有在派生类有同名成员时才需要限定符,因此您可以区分它们。但这应该避免。
  • 任一类中只有一个成员变量。 testFirst::testSecond::testSecond 中都指代同一事物。最好只使用test
  • 你只声明了一个成员变量int test;在您的 First class 中,两个函数调用都引用了相同的内存位置 5。但是,如果您定义另一个变量 int test;在您的第二堂课中,他们将相应地做出不同的参考。另外,你必须知道二等也是一等。所以你可以这样做: Second *sec = new First();现在属于第一类的所有属性都将在第二类中。

标签: c++ pointers inheritance


【解决方案1】:

没有区别 - Second 对象只有一个 test 成员,继承自 First。这么说

return First::test;

是多余的 - 你可以使用

return test

(没有this 作为其他答案状态 - 这也不是必需的)。你也不应该使用

Second::GetTestFirst()

和类似的。编译器完全知道它正在编译Second

GetTestFirst()

就够了。据我所知,您的代码中的所有First::Second:: 都不是必需的。最后的观察:在 C++ 中,除非需要,否则不应使用动态内存。而不是

Second * sec = new Second;

你应该使用

Second sec;

之后是.,而不是-&gt;

【讨论】:

  • 好的,如果我想在子类中创建“void SetTest(int x)”怎么办?最好使用“First::test = x”还是“Second::x = x”?还是没关系?
  • 在 child 中设置 setter 并在 parent 中设置 member 会很奇怪,但它是有效的。再说一遍——除非你需要区分不同的成员,否则你不应该使用First::Second::。在您的示例中,只有一个成员 test 所以不要使用这些前缀,因为它具有误导性。
【解决方案2】:

GetTestFirst() 和 GetTestSecond() 做同样的事情,因为 test 变量只在基类中定义。解决该变量的正确方法是使用 this 关键字;

return this->test;

【讨论】:

  • 这不是“正确”的方式。没有必要使用this,因为成员变量(包括从基类继承的变量)在成员函数的范围内。这只是不必要的打字。
  • 使用this-&gt; 被认为是一种很好的做法,它对第一次阅读代码的人有很大帮助。
  • 我同意,proper 是一个不正确的词。另外,是的,您不必使用 this 关键字。但是,我相信 this 在执行代码审查时是一个更强有力的声明。
  • @Kupto 根据谁的良好实践?请引用有信誉的来源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2015-10-21
  • 2013-08-16
  • 1970-01-01
相关资源
最近更新 更多