多态性和对象存储
Polymorphism and object storage
0i'在C 时非常生锈。我尝试了各种搜索,但无法提出答案。我有以下代码:
class Base
{
public:
Base() {};
virtual void hello() { std::cout << "I'm the base class" << std::endl; }
};
class Alice : public Base
{
public:
Alice() {};
virtual void hello() { std::cout << "I'm Alice" << std::endl; }
};
class Bob : public Base
{
public:
Bob() {};
virtual void hello() { std::cout << "I'm Bob" << std::endl; }
};
Base test(int alice)
{
if(alice)
return Alice();
else
return Bob();
}
int main()
{
Base a = test(0);
Base b = test(1);
a.hello();
b.hello();
}
我希望输出为
I'm Alice
I'm Bob
,但它是
I'm the base class
I'm the base class
什么(除了在脑子里,还有什么?
test
的返回类型是 Base
。这意味着它仅返回Base
S和Base
S。不会从该功能返回Alice
S或Bob
S。当您执行return Alice();
或return Bob();
时,这些对象的Base
部分获取切成薄片 out并返回。
同样,main
中的对象a
和b
是类型Base
,这就是它们的全部。这就是为什么当您在它们上调用hello
时,您正在调用Base
实现。
在C 中,您可以使用 Pointers 或参考来利用多态性。也就是说,Base*
或Base&
可以指向或参考Alice
或Bob
对象。然后,当您尝试通过该指针或参考调用虚拟成员函数时,该函数的适当实现将通过查看对象的运行时类型来确定。
作为一个简单的测试,您可以动态分配Alice
和Bob
对象,然后将指针返回给它们:
Base* test(int alice)
{
if(alice)
return new Alice();
else
return new Bob();
}
您需要使a
和b
具有Base*
类型,然后打Hello,例如a->hello()
。但是,如果您动态分配这样的对象,则必须记住delete
它们。更好的是,使用诸如std::unique_ptr
之类的智能指针,多态性仍然可以起作用。
还要注意,如果要使用这些类型的多态类型,则应实现虚拟破坏者。
相关文章:
- 如何使用 stl 容器有效地存储对象?(即根据其字段的值进行搜索)
- 线程上下文上的静态存储对象优化
- OOP - 存储对象和服务接口
- 为什么存储对象地址在缓冲区中会导致内存泄漏并删除它们
- 是否保证在销毁所有线程本地存储对象后销毁全局对象
- 使用列表存储对象
- 在c++中存储一个对象或不存储对象的首选方式是什么
- 更好的是:存储对象与存储指针
- 应用程序使用QMAP存储对象时停止响应
- 使用堆栈存储对象
- 如何在 std::map 中存储"对象类型"?
- 我应该如何存储对象
- 在 c++ 中存储对象的最佳策略是什么,确保名称唯一并能够在以后有效地检索它们
- 用于存储对象列表的最佳标准类
- 在C++中存储对象地址的数据结构
- 函子如何维护/存储对象的状态
- 我如何定义一个向量,并用C++在其中存储对象
- 存储对象以备将来使用(在重新启动程序时)
- C++/JNI-存储对象(jobject)在向量和数组中发生意外更改,C++或JNI问题
- 在多个容器中存储对象的最佳实践