【发布时间】:2016-02-24 06:34:59
【问题描述】:
假设我想创建一个界面
-
Items 有可以阅读的内容。 -
Items 有可写的内容。 -
Items 的内容可以读写
但是我不想创建 3 个抽象类,因为我可能想传递一个 Item,它对只接受可读项目的函数是可读写的。
例如你只能读取Book,所以Book会继承Readable,而Note可以读写,所以它会继承ReadWritable。
所以现在我可以创建这样的函数了:
std::string read(Readable& readable) const
或
void take_a_note(Writable& writable)
我有这个Readable 抽象类
template <typename ReadableType>
class Readable
{
public:
Readable(const ReadableType content);
virtual ~Readable(void);
virtual auto content(void) const noexcept -> const ReadableType&&;
private:
const ReadableType _content;
};
还有一个Writable 抽象类
template <typename WritableType>
class Writable
{
public:
Writable(void);
virtual ~Writable(void);
virtual void content(WritableType&& content) noexcept;
private:
WritableType _content;
};
但现在我想创建一个结合了这些功能的抽象类,称为ReadWritable
template <typename ReadWritableType>
class ReadWritable: public Readable<ReadWritableType>, public Writable<ReadWritableType>
{
public:
ReadWritable(ReadWritableType content);
virtual ~ReadWritable(void);
using Writable<ReadWritableType>::content;
using Readable<ReadWritableType>::content;
};
这就是问题所在,因为content(WritableType&& content) 使用Writable::_content,而content(void) 使用Readable::_content。
如何让它们使用相同的 _content 数据成员。如果我能做到这一点,有没有办法删除另一个?
或者我的完整方法是错误的?我愿意接受所有意见。
【问题讨论】:
-
我不确定你的问题是否正确 - 但是你看过虚拟基类的概念吗?这将确保派生的 ReadWritable 类中只有一个 _content 成员
-
我认为这仅适用于基类是完全相同的基础,例如如果我继承了 Readable 两次。问题不是真的有过载,而是 Readable::content() 和 Writable::content() 都有自己的私有变量
_content,它们不会协调 -
分离接口和实现。接口不应该存储任何状态,你应该在实现中存储所有状态。
-
我不认为模板是这种情况下更好的用法,你不想为每个特定的可重写和可写对象创建代码,但你的类希望得到一个填充接口的对象,如前所述@tofro,您应该检查虚拟课程。
标签: c++ inheritance multiple-inheritance base-class