【问题标题】:Unexpected output of inherited member function继承的成员函数的意外输出
【发布时间】:2019-11-08 16:42:17
【问题描述】:

考虑以下代码:

#include <list>
#include <iostream>

class test{
    private:
        std::list<double> lst;

    public:
        int get_size(){
            return lst.size();
        }
};

class derived : public test{
    private:
        std::list<double> lst;

    public:
        derived(int u=8){
            for (int k =0 ; k < u; ++k){
                int n = lst.size();
                lst.push_back(0);
            }
        }
};

int main(){

    derived obj = derived();

    std::cout << obj.get_size() << "\n";
    return 0;
}

我试图理解为什么上面代码的输出不是8。我认为继承的想法允许人们在派生类中使用基类的成员函数,但似乎这在这里并不适用。当然我可以在基类中创建get_size函数virtual,然后将代码复制粘贴到派生类中并添加override,但这看起来很奇怪,因为在这种情况下我可以重新实现无论如何,函数......那么有人可以解释一下我们需要如何修改上面的代码以获得输出8吗?

【问题讨论】:

  • 您不能对成员变量重载或使用多态。 get_size 函数只知道 test 类,因此使用 test::lst
  • @Someprogrammerdude 所以你实际上必须将函数复制到派生类中?没有其他办法解决这个问题吗?
  • 您可以创建test::lst protected 并删除derived::lst 成员吗?

标签: c++ class inheritance


【解决方案1】:

您没有使用来自testlist。您正在声明一个新的 list 并在 derived 的构造函数中使用它。

另一方面,size() 使用来自testlist

如果您想从derived 内部添加到test list,您应该将test 的列表设为protected,而不是私有。您应该从derived 中删除具有重复名称的list

【讨论】:

    【解决方案2】:

    derived 类中的 lst 与基类中使用的不同。

    您应该在 test 基类中创建 lst protected 而不是 private。 然后您可以在派生类中使用相同的变量。当然你还需要删除派生类中的lst声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 1970-01-01
      • 2010-10-03
      • 2013-05-09
      • 2016-06-24
      • 1970-01-01
      • 2011-06-20
      相关资源
      最近更新 更多