[英]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<A*> foo;
附加好处:媒介可以按需增长和收缩。 std::vector<std::shared_ptr<A> > foo;
额外好处:不再担心delete
。 但是,如果不知道要实现什么目标,就不可能提出正确的方法。
1.您应该避免切片
您应该使用A*
而不是A
这可以帮助您理解原因: 什么是对象切片?
2.您应该将A
类的sayNum()
函数声明为virtual
函数
A
类A
定义应如下所示:
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。
这类似于分配float
到int
-你失去所有的小数。
您缺少每个类中函数的返回类型。 假设您希望返回类型为void
:
void sayNum() { cout<<num;}
访问数组元素时,请使用数组对象的下标:
例如:
foo[0]=something;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.