将抽象值对象保存在包装器中和继承的用法中
Saving abstract value object in wrapper and Usage of inheritance
我有有关C 类继承的问题。我有一个具有虚拟方法的类,例如:
class IFoo {
public:
virtual int sayFoo() = 0;
};
我有几个实现,例如:
class Foo1: public IFoo {
public:
virtual int sayFoo() {
return 1;
}
};
class Foo2: public IFoo {
public:
virtual int sayFoo() {
return 2;
}
};
我想将IFoo
实例保存在虚拟集装箱类中(例如一种包装器(,以公开IFoo
的相同接口:
class DummyWrapper : public IFoo {
public:
DummyWrapper(IFoo& foo): foo{foo} {}
virtual int sayFoo() {
return foo.sayFoo(); //ALPHA
}
private:
IFoo& foo; //BETA
};
通常一切都应该有效,例如:
IFoo& foo = Foo1{};
DummyWrapper wrapper{foo};
wrapper.sayFoo();
我的问题是foo
实际上只是一个R值,在其范围熄灭后被删除,就像这里:
DummyWrapper generateWrapper() {
return DummyWrapper{Foo1{}};
}
这会导致读取" alpha"行中的问题。解决方案是将R值放在堆上,并使用指针访问FOO。由于我是C 的新手,也许我陷入了XY问题,所以我的问题是:
- 这是唯一的解决方案吗?没有更好的方法可以解决问题吗?
- 我不认为我可以用
IFoo foo
替换" beta"行,因为这样的方式,DummyWrapper
将始终存储IFoo
的字节,而不是IFoo
实现的字节。也许我可以使用值IFoo foo
来调用派生的虚拟方法?
感谢任何回复
这是唯一的解决方案吗?没有更好的方法可以解决问题吗?
不幸的是,一旦涉及多态性,是的,不是,没有。但是,如果您使用智能指针:
,您可以获得存储IFoo foo
的几乎等效的解决方案: // member:
std::unique_ptr<IFoo> foo;
// constructor:
DummyWrapper(std::unique_ptr<IFoo>&& foo): foo(std::move(foo)) { }
// need to accept r-value ^
// reference: std::unique_ptr is only movable, not copiable!
// for the same reason, you need to preserve the r-value reference
// on assignment to member...
// creation of the wrapper:
return DummyWrapper(std::make_unique<Foo1>(/* arguments for constructor, if there are */));
我不认为我可以用ifoo foo替换" beta"行,因为这样的方式,dummywrapper将始终存储ifoo的字节,而不是Ifoo实现的字节。或者,也许我可以使用值ifoo foo来调用派生的虚拟方法?
绝对正确:这是一种称为"对象切片"的效果,在您将派生对象分配给基本对象时,来自派生类型的所有剩余内容都会丢失。非常常见的问题(例如,当人们尝试将派生的对象存储在std::vector<Base>
中时(。
通常,当我们想更改类的接口或想要实现其他功能时,我们会创建包装器 std::queue<T>
是std::std::deque<T>
上的包装器/适配器(默认情况下(std::queue<T>
类模板充当基础容器的包装器 - 仅提供了一组特定的功能。队列推动下面容器背面的元素并从前面弹出。
在您的情况下,我认为您不需要DummyWrapper
您可以使用IFoo
代替DummyWrapper
,并且可以执行相同的工作。
让以下功能考虑以下功能,
bool isEven( IFoo& ifoo) // Not const& because sayFoo() is not const method.
{
return ( 0 == ( ifoo.sayFoo() % 2)) ;
}
此功能将适用于Foo1
,Foo2
等所有类型,并且不需要包装器。
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 这个指针在c++中的用法
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 错误:'int_type'未命名类型 - 如何继承 typedefs 和用法
- "The C++ Programming Language"中所述的私有继承用法
- 将抽象值对象保存在包装器中和继承的用法中
- Pimpl习惯用法、单独的接口/实现文件和多个虚拟继承.如何
- 这是多重继承的良好用法吗?
- 继承自 std::函数、语法和用法
- 带有继承的C++作用域解析用法
- vector +继承的用法
- typedef与继承中typename的用法