C++ 如何使继承的基类使用公共变量
假设我想为创建一个接口C++ 如何使继承的基类使用公共变量,c++,inheritance,multiple-inheritance,base-class,C++,Inheritance,Multiple Inheritance,Base Class,假设我想为创建一个接口 具有可读取内容的项目s 项s,其内容可以写入 项s,其内容可以读/写 但是,我不想创建3个抽象类,因为我可能希望传递一个项,它可以读写到一个只接受可读项的函数 e、 g.您只能阅读书籍,因此书籍将继承可读,而注释可以读写,因此它将继承可读 现在我可以创建这样的函数: std::string read(Readable& readable) const 或 我有一个可读的抽象类 template <typename ReadableType> cla
具有可读取内容的项目
s项
s,其内容可以写入项
s,其内容可以读/写项
,它可以读写到一个只接受可读项的函数
e、 g.您只能阅读书籍
,因此书籍
将继承可读
,而注释
可以读写,因此它将继承可读
现在我可以创建这样的函数:
std::string read(Readable& readable) const
或
我有一个可读的抽象类
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;
};
template <typename WritableType>
class Writable
{
public:
Writable(void);
virtual ~Writable(void);
virtual void content(WritableType&& content) noexcept;
private:
WritableType _content;
};
但是现在我想创建一个结合了这些功能的抽象类,名为readwriteable
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;
};
模板
类可读写:公共可读,公共可写
{
公众:
可读写(可读写类型内容);
虚拟~可读写(无效);
使用Writable::content;
使用可读的内容;
};
这就是问题所在,因为content(WritableType&content)
使用Writable:\u content
,而content(void)
使用Readable:\u content
如何让他们使用相同的\u内容
数据成员。如果我能做到,有没有办法删除另一个
还是我的方法完全错了?我对每一种观点都持开放态度。我不确定我的问题是否正确,但根据我的理解,您希望让两个单独的类共享相同的数据,并且仍然使用这些共享数据继续它们的功能 我已经用几个组合进行了测试,下面的代码运行良好。然而,我不得不做出一些改变:
#include <iostream>
class ReadableType
{
public: int id=0;
int* sharedValue;
};
class WritableType
{
public: int id=1;
int* sharedValue;
};
class ReadWritableType
{
public: int id=2;
int* sharedValue;
ReadWritableType(int share){sharedValue = new int;*sharedValue = share;};
};
class Readable
{
public:
void content(void){std::cout << "id: "<<_content->id <<" sharedValue: "<<*_content->sharedValue<<std::endl;};
protected:
ReadableType *_content;
};
class Writable
{
public:
void content(WritableType content){std::cout << "id: "<<_content->id <<" sharedValue: "<<*_content->sharedValue<<std::endl;};
protected:
WritableType *_content;
};
class ReadWritable: public Readable, public Writable
{
public:
ReadWritable(ReadWritableType* content);
using Writable::content;
using Readable::content;
private:
void makeReadable(ReadWritableType* content);
void makeWritable(ReadWritableType* content);
};
ReadWritable::ReadWritable(ReadWritableType* content)
{
makeReadable(content);
makeWritable(content);
}
void ReadWritable::makeReadable(ReadWritableType* content)
{
Readable::_content = new ReadableType();
Readable::_content->sharedValue = content->sharedValue;
}
void ReadWritable::makeWritable(ReadWritableType* content)
{
Writable::_content = new WritableType();
Writable::_content->sharedValue = content->sharedValue;
}
int main()
{
ReadWritable x(new ReadWritableType(5));
WritableType s;
x.content();
x.content(s);
}
#包括
类可读类型
{
public:int id=0;
int*共享值;
};
类可写类型
{
公共:int id=1;
int*共享值;
};
类可读写类型
{
公共:int id=2;
int*共享值;
可读写类型(int共享){sharedValue=new int;*sharedValue=share;};
};
类可读
{
公众:
void content(void){std::cout我不确定我的问题是否正确,但根据我的理解,您希望使两个单独的类共享相同的数据,并且仍然使用此共享数据继续其功能
我已经用几个组合进行了测试,下面的代码运行良好。但是我不得不做一些更改:
#include <iostream>
class ReadableType
{
public: int id=0;
int* sharedValue;
};
class WritableType
{
public: int id=1;
int* sharedValue;
};
class ReadWritableType
{
public: int id=2;
int* sharedValue;
ReadWritableType(int share){sharedValue = new int;*sharedValue = share;};
};
class Readable
{
public:
void content(void){std::cout << "id: "<<_content->id <<" sharedValue: "<<*_content->sharedValue<<std::endl;};
protected:
ReadableType *_content;
};
class Writable
{
public:
void content(WritableType content){std::cout << "id: "<<_content->id <<" sharedValue: "<<*_content->sharedValue<<std::endl;};
protected:
WritableType *_content;
};
class ReadWritable: public Readable, public Writable
{
public:
ReadWritable(ReadWritableType* content);
using Writable::content;
using Readable::content;
private:
void makeReadable(ReadWritableType* content);
void makeWritable(ReadWritableType* content);
};
ReadWritable::ReadWritable(ReadWritableType* content)
{
makeReadable(content);
makeWritable(content);
}
void ReadWritable::makeReadable(ReadWritableType* content)
{
Readable::_content = new ReadableType();
Readable::_content->sharedValue = content->sharedValue;
}
void ReadWritable::makeWritable(ReadWritableType* content)
{
Writable::_content = new WritableType();
Writable::_content->sharedValue = content->sharedValue;
}
int main()
{
ReadWritable x(new ReadWritableType(5));
WritableType s;
x.content();
x.content(s);
}
#包括
类可读类型
{
public:int id=0;
int*共享值;
};
类可写类型
{
公共:int id=1;
int*共享值;
};
类可读写类型
{
公共:int id=2;
int*共享值;
可读写类型(int共享){sharedValue=new int;*sharedValue=share;};
};
类可读
{
公众:
void content(void){std::cout如果有一个额外的层,您可以这样做
template <typename ReadableType>
class IReadable
{
public:
virtual ~IReadable() = default;
virtual const ReadableType& content() const noexcept = 0;
};
template <typename WritableType>
class IWritable
{
public:
virtual ~IWritable();
virtual void content(WritableType&& content) noexcept = 0;
};
template <typename ReadableType>
class Readable : public IReadable
{
public:
Readable(const ReadableType& content);
virtual const ReadableType& content() const noexcept override;
private:
const ReadableType _content;
};
template <typename WritableType>
class Writable
{
public:
virtual void content(WritableType&& content) noexcept override;
private:
WritableType _content;
};
模板
类IReadable
{
公众:
virtual~IReadable()=默认值;
虚拟常量ReadableType&content()常量noexcept=0;
};
模板
类IWritable
{
公众:
虚拟~IWritable();
虚拟无效内容(可写类型和内容)noexcept=0;
};
模板
类可读:公共IReadable
{
公众:
可读(常量可读类型和内容);
virtual const ReadableType&content()const noexcept override;
私人:
常量可读类型_内容;
};
模板
类可写
{
公众:
虚拟无效内容(可写类型和内容)无异常覆盖;
私人:
可写类型\u内容;
};
最后:
template <typename ReadWritableType>
class ReadWritable: public IReadable<ReadWritableType>, public IWritable<ReadWritableType>
{
public:
ReadWritable(ReadWritableType content);
virtual void content(WritableType&& content) noexcept override;
virtual const ReadableType& content() const noexcept override;
private:
ReadWritableType _content;
};
模板
类可读写:public-IReadable,public-IWritable
{
公众:
可读写(可读写类型内容);
虚拟无效内容(可写类型和内容)无异常覆盖;
virtual const ReadableType&content()const noexcept override;
私人:
可读写类型\u内容;
};
您确实需要重新实现readwriteable::content
,但代码可能会被分解为Readable
/writeable
一个,然后重新使用。如果有一个额外的层,您可以这样做
template <typename ReadableType>
class IReadable
{
public:
virtual ~IReadable() = default;
virtual const ReadableType& content() const noexcept = 0;
};
template <typename WritableType>
class IWritable
{
public:
virtual ~IWritable();
virtual void content(WritableType&& content) noexcept = 0;
};
template <typename ReadableType>
class Readable : public IReadable
{
public:
Readable(const ReadableType& content);
virtual const ReadableType& content() const noexcept override;
private:
const ReadableType _content;
};
template <typename WritableType>
class Writable
{
public:
virtual void content(WritableType&& content) noexcept override;
private:
WritableType _content;
};
模板
类IReadable
{
公众:
virtual~IReadable()=默认值;
虚拟常量ReadableType&content()常量noexcept=0;
};
模板
类IWritable
{
公众:
虚拟~IWritable();
虚拟无效内容(可写类型和内容)noexcept=0;
};
模板
类可读:公共IReadable
{
公众:
可读(常量可读类型和内容);
virtual const ReadableType&content()const noexcept override;
私人:
常量可读类型_内容;
};
模板
类可写
{
公众:
虚拟无效内容(可写类型和内容)无异常覆盖;
私人:
可写类型\u内容;
};
最后:
template <typename ReadWritableType>
class ReadWritable: public IReadable<ReadWritableType>, public IWritable<ReadWritableType>
{
public:
ReadWritable(ReadWritableType content);
virtual void content(WritableType&& content) noexcept override;
virtual const ReadableType& content() const noexcept override;
private:
ReadWritableType _content;
};
模板
类可读写:public-IReadable,public-IWritable
{
公众:
可读写(可读写类型内容);
虚拟无效内容(可写类型和内容)无异常覆盖;
virtual const ReadableType&content()const noexcept override;
私人:
可读写类型\u内容;
};
您确实需要重新实现readwriteable::content
,但代码可能会被分解为Readable
/writeable
一个,然后重新使用。我不确定我是否正确回答了您的问题-但是您是否已经了解了虚拟基类的概念?这将确保派生的可读写cl中只有一个_content成员assI认为这只适用于基类与基类完全相同的情况,例如,如果我继承了Readable两次。问题不是真的存在重载,而是Readable::content()和Writable::content()的问题每个都有自己的私有变量\u content
,它们不会协调分离的接口和实现。接口不应该存储任何状态,您应该在实现中存储所有状态。我认为模板在这种情况下不是更好的用法,您不想创建