C++ C++;类继承

C++ C++;类继承,c++,class,C++,Class,我上课有点问题 代码: class A { public: int num; sayNum() { cout<<num;} }; class B : public A { public: sayNum() { cout<<"my num is: "<<num;} }; /*somewhere else...*/ A foo[10]; B something; something.num=10; foo[0]=somethi

我上课有点问题

代码:

class A
{
public:
     int num;
     sayNum() { cout<<num;}
};

class B : public A
{
public:
     sayNum() { cout<<"my num is: "<<num;}
};

/*somewhere else...*/
A foo[10];

B something;
something.num=10;

foo[0]=something;

foo[0].sayNum();
/*...*/
A类
{
公众:
int-num;

sayNum(){cout在以下函数的定义中将函数sayNum声明为虚拟函数:

virtual void sayNum() { cout<<num;}

virtualvoidsaynum(){coutNo,通过将
something
赋值给
foo[0]
可以将其转换为A

这类似于将一个
浮点
分配给一个
整数
——您将丢失所有的小数

  • 您缺少每个类中函数的返回类型。假设您希望返回类型为
    void

    void sayNum(){cout此行:

    foo[0]=something;
    
    将某物复制到数组中。由于
    something
    (即B类)的类型与
    foo[0]
    (即A类)的类型不同,因此存在转换。在这种情况下,
    something
    将被切片,只有A部分将保留

    最终的结果是
    foo[0]
    仍然包含类型为
    class A
    的对象,因此“my num is”将永远不会被输出

    sayNum()
    更改为虚拟,这是解决代码将显示的其他问题的好建议,在这种情况下没有帮助

    如何解决,取决于您想要实现的目标。可能的解决方案有:

    • 将数组更改为包含指针
      A*foo[10];
      注意:这意味着您必须使用“新建”和“删除”
    • 使用std::vector而不是数组:
      std::vector foo;
      其他好处:向量可以根据需要增减
    • 使用智能指针
      std::vector foo;
      其他好处:不再担心
      删除

    但是如果不知道你想要实现什么,就不可能提出正确的方法。

    1.你应该避免切片 您应该使用
    A*
    而不是
    A
    。这可以帮助您理解为什么:

    2.应该将类
    a
    sayNum()函数声明为
    virtual

    A
    的定义应如下所示:

    class A
    {
    public:
        int num;
        virtual void sayNum() { cout << num; }
    };
    
    A* foo[10];
    
    B something;
    something.num=10;
    
    foo[0] = &something;
    
    foo[0]->sayNum();
    

    虽然这是一个很好的建议,但在这种情况下还不够好。对数组的赋值将分割对象,并且只有a部分被复制到数组中。@sjoard那么如何存储不同类的数组呢?@kittyPL通过存储指针(或智能指针)您要存储的类型的公共基类。这不是他的问题。我同意。我添加了注释以表明即使您指出的问题已解决,他的问题仍将存在。抱歉,我只是在编写它,例如,我甚至没有尝试编译:)