C++ class inheritance
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
将被切片,并且只有A部分将存活下来。
最终结果是foo[0]
仍然包含一个类型为class A
的对象,因此"my num is"将永远不会输出。
将sayNum()
更改为虚拟,这是解决代码将显示的其他问题的好建议,但在这种情况下没有帮助。
如何解决它,取决于你想要实现什么。可能的解决方案有:
- 将数组更改为包含指针:
A* foo[10];
注意:这意味着您必须使用"new"answers"delete" - 使用std::vector而不是数组:
std::vector<A*> foo;
其他好处:vector可以根据需要增长和收缩 - 使用智能指针:
std::vector<std::shared_ptr<A> > foo;
其他好处:不再担心delete
但是,如果不知道自己想要实现什么,就不可能提出正确的方法。
1。您应该避免切片
您应该使用A*
而不是A
。这可以帮助您理解为什么:什么是对象切片?
2.应将类A
的sayNum()
函数声明为virtual
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();
否,通过将something
分配给foo[0]
,可以将其转换为A.
这类似于将float
分配给int
——您将丢失所有小数。
-
您在每个类中都缺少函数的返回类型。假设您希望返回类型为
void
:void sayNum() { cout<<num;}
-
访问数组元素时,使用数组对象:上的下标
例如:
foo[0]=something;
在A:的定义中将函数sayNum声明为虚拟
virtual void sayNum() { cout<<num;}
编辑:感谢Sjoerd的评论——这对你仍然没有帮助。如果你想利用多态性,你需要创建一个指向类A的指针数组,而不是类A的数组。
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- "Undefined class"作为is_base_of的论据
- 如何将class.cpp和class.hpp编译为一个.o文件
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使用"derived input class"创建派生类?
- 错误:"Left of getValue must have class/struct/union"
- ' class a : b ' 和 ' class a : public b ' 之间的继承类不同
- Pybind11 Class Definition
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- C2011 'CMemDC':Visual Studio 2019中的'class'类型重新定义
- TypeError: [c++ addon class] 不是构造函数
- 尝试应用肖恩父母谈话"inheritance is the base class of evil"中的模式
- Python class inheritance to c++
- "virtual base class in the case of multilevel inheritance"有意义吗
- Class inheritance obsecure
- 关于肖恩·帕伦特谈话的澄清 "Inheritance is the base class of evil"
- C++ class inheritance
- Constexpr class: Inheritance?