【问题标题】:Can`t get value of member of derived class无法获取派生类成员的值
【发布时间】:2012-08-15 13:58:22
【问题描述】:

我有:

VirtualClass : public QObject
{
public:
    int m_number;
}

DerivedClass : public VirtualClass 
{
public:
    DerivedClass(int number) : m_number(number) {};
    int m_number;
    // some content goes here..
}

客户端代码:

f(VirtualClass* instance)
{
std::cout << instance->m_number;
}

DerivedClass der(100);

我希望 f(der) 返回与 DerivedClass 相关的 m_number ,但*我得到了 VirtualClass 的 m_number*。 我做错了什么?!!

【问题讨论】:

    标签: c++ inheritance interface


    【解决方案1】:

    DerivedClass 中删除int m_number;。否则你必须有不同的m_number 成员。一个来自VirtualClass,另一个来自DerivedClass

    当您在DerivedClass 中添加int m_number; 时,您将隐藏m_number;VirtualClass

    这是一个如何工作的示例:

    struct Foo
    {
        int a;
    };
    
    struct Bar : Foo
    {
        int a; //another a
    };
    
    int main()
    {
        Bar *f = new Bar();
        f->a = 10; //Bar::a
    
        Foo *b = f;
        b->a = 20; //Foo::a
    
        cout << f->a << endl; //prints 10
        cout << b->a << endl; //prints 20
    }
    

    【讨论】:

    • 酷!谢谢你。我听从了你的建议。在调用派生类的构造函数时,我还删除了成员初始化器语法:replaced class(int number):m_number(number){};使用简单类 (int number){m_number = number},否则编译失败
    【解决方案2】:

    你已经声明了两次int m_number;。你应该只声明一次。

    【讨论】:

      【解决方案3】:

      自旋八: 如果需要,可以通过在 VirtualClass 上提供适当的构造函数并从派生的初始值设定项列表中调用它来保留初始值设定项列表,如下所示:

      VirtualClass : public QObject 
      { 
       public: 
       VirtualClass(int number) : m_number(number) { }
       int m_number; 
      }
      
      DerivedClass : public VirtualClass
      {
       public: 
       DerivedClass(int number) : VirtualClass(number) {}; 
       // some content goes here.. 
      } 
      

      【讨论】:

      • 谢谢,这看起来比:simple class (int number){m_number = number} 效果更好
      猜你喜欢
      • 1970-01-01
      • 2017-12-02
      • 2018-11-30
      • 2019-01-20
      • 2013-10-21
      • 2015-12-30
      • 1970-01-01
      • 2012-08-29
      相关资源
      最近更新 更多