繁体   English   中英

C ++类继承

[英]C++ class inheritance

我在上课时遇到了一些问题。

在代码中:

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();
/*...*/

当我调用foo [0] .sayNum();时 它显示“ 10”,我希望它显示“我的数字是:10”。 我无法更改数组的类型。 请注意,这只是一个示例代码,如果我在此处粘贴我的代码,将很难理解:D)

这行:

foo[0]=something;

复制一些东西到数组中。 因为something的类型(即类B)与foo[0]的类型(即类A)不同,所以需要进行转换。 在这种情况下, something会被切成薄片 ,只有一部分会存活下来。

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

sayNum()更改为虚拟,这是解决您的代码将显示的其他问题的好建议,在这种情况下无济于事。

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

  • 更改数组以包含指针A* foo[10]; 注意:这意味着您必须使用'new'和'delete'。
  • 使用std :: vector而不是数组: std::vector<A*> foo; 附加好处:媒介可以按需增长和收缩。
  • 使用智能指针std::vector<std::shared_ptr<A> > foo; 额外好处:不再担心delete

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

1.您应该避免切片
您应该使用A*而不是A 这可以帮助您理解原因: 什么是对象切片?

2.您应该将A类的sayNum()函数声明为virtual函数
AA定义应如下所示:

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

然后,您在somewhere else所说的代码可能如下所示:

A* foo[10];

B something;
something.num=10;

foo[0] = &something;

foo[0]->sayNum();

在A的定义中将函数sayNum声明为虚拟的:

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

编辑:感谢Sjoerd的评论-这仍然对您没有帮助。 如果要利用多态性,则需要创建一个指向A类的指针数组,而不是一个指向A类的数组。

不,通过为foo[0]分配something ,可以将其转换为A。

这类似于分配floatint -你失去所有的小数。

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

    void sayNum() { cout<<num;}

  2. 访问数组元素时,请使用数组对象的下标:

    例如:

    foo[0]=something;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM