继承的成员函数的意外输出

Posted

技术标签:

【中文标题】继承的成员函数的意外输出【英文标题】: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 成员吗? 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于继承的成员函数的意外输出的主要内容,如果未能解决你的问题,请参考以下文章

编程打卡: C++ 语言程序设计: 继承与派生: 习题

4CPP 面向对象之 ——多态多继承static 成员const 成员

在c++中的继承,如何在子类中重载成员函数

类与类之间的友元关系可以继承吗? 友元函数是类的成员函数吗?

请问含有多个对象成员的派生类的构造函数执行时不是先执行基类么?为啥这个先输出的是“正式生是”这个

C++派生类是不是可以从基类继承静态数据成员和静态成员函数?