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通过存储指针(或智能指针)您要存储的类型的公共基类。这不是他的问题。我同意。我添加了注释以表明即使您指出的问题已解决,他的问题仍将存在。抱歉,我只是在编写它,例如,我甚至没有尝试编译:)