继承的成员函数的意外输出
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】:
您没有使用来自test
的list
。您正在声明一个新的 list
并在 derived
的构造函数中使用它。
另一方面,size()
使用来自test
的list
。
如果您想从derived
内部添加到test
list
,您应该将test
的列表设为protected
,而不是私有。您应该从derived
中删除具有重复名称的list
。
【讨论】:
【参考方案2】:derived
类中的 lst
与基类中使用的不同。
您应该在 test
基类中创建 lst
protected
而不是 private
。
然后您可以在派生类中使用相同的变量。当然你还需要删除派生类中的lst
声明。
【讨论】:
以上是关于继承的成员函数的意外输出的主要内容,如果未能解决你的问题,请参考以下文章
4CPP 面向对象之 ——多态多继承static 成员const 成员
类与类之间的友元关系可以继承吗? 友元函数是类的成员函数吗?