子对象作为参数
child object as a parameter
我想做如下事情:
virtual void Aircraft::getImage(GenericImage&)=0;
void Drone::getImage(Image&);
哪里 Image
是GenericImage
的子类 Drone
是Aircraft
的一个子类。
如何要求 Drone 类具有getImage(any subclass of genericImage&)
方法,而不会让编译器抱怨genericImage
和Image
不是一回事?我希望最终用户/开发人员能够使用自己的图像格式定义自己的无人机类,该格式扩展genericImage
但无论他们创建什么,他们都必须提供从无人机获取图像的功能。
不要采用 out 参数,只需返回图像即可。允许返回类型是协变的。这意味着,只要Image
实际上公开从GenericImage
派生,就可以了:
virtual GenericImage& Aircraft::getImage() = 0;
virtual Image& Drone::getImage();
这种方式更改参数,也不应该这样做,因为它通常会违反 Liskov 替换原则 (LSP(:根据定义,Aircraft::getImage
可以接受任何GenericImage
,其中包括 GenericImage
的任意子类。子类必须符合该接口,因此还必须接受任何GenericImage
。但是,您明确希望指定它仅接受特定的子类型 Image
。
请注意,返回类型的情况有所不同,因为它们表示函数生成的东西而不是函数接受的东西(你可能会说你的getImage
也产生,但C++不知道 out 参数的概念,你确实必须将现有对象传递给 getImage
才能用图像数据填充它(。由于对于返回类型,转到派生类型不会违反 LSP,C++确实允许它(该功能称为协变返回类型(。因此,解决方案是在函数中分配图像对象并返回该对象(最好使用指针 - 不幸的是,智能指针不适用于协变返回类型 - 来指示发生的分配(。也就是说,您的函数将读取
class Aircraft
{
virtual GenericImage* getImage() = 0;
};
class Drone: public Aircraft
{
virtual Image* getImate() { return new Image(); }
};
但是,您很可能只会使用基类接口,因此我宁愿只使用接口中的GenericImage
,而是利用智能指针:
class Aircraft
{
virtual std::unique_ptr<GenericImage> getImage() = 0;
};
class Drone: public Aircraft
{
virtual std::unique_ptr<GenericImage> getImate() { return new Image(); }
};
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- Arduino C++在构造函数中用参数声明对象数组
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- C++ 类对象作为函数参数
- 如何将对象数组作为参数传递给模板
- 使用向量初始化参数化构造函数的对象数组
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 如何编写将展开以定义具有模板参数的对象的宏
- C++类对象 - 遍历基于参数的对象
- 将指针传递到成员的指针,从模板参数包到函数对象
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 是否可以获取成员函数模板参数的拥有对象?
- C++多参数对象创建
- 在不创建参数对象的情况下解析constexpr函数
- 推断模板参数对象成员的类型
- 如何解析c++ v8中的参数对象
- 当默认参数对象被销毁时
- 为什么函数不能更改其参数对象的地址/引用值?