是否有可能隐式地将派生类转换为使用公共基础派生的抽象,而无需首先转换为基数?
示例:
class IOBase
{
public:
virtual std::vector<unsigned char> read(int size) = 0;
virtual void write(const std::vector<unsigned char> & data) = 0;
};
// Derived abstract class
class Input : public IOBase
{
private:
using IOBase::write;
};
// File IO derived class
class FileIO : public IOBase
{...}
class FileInput : public FileIO
{
private:
using FileIO::write;
};
void ReadFromInput(Input& input) {...}
void main()
{
FileInput fi;
ReadFromInput(fi); <-- compiler error,
should be first casted to base class IOBase and
then to abstract class Input
FileIO f;
ReadFromInput(f); <-- compiler error
}
请注意,read
和write
方法不能是常量。
答案 0 :(得分:1)
您的FileIO
并非来自Input
,因此不仅可以省略演员表,而且演员实际上甚至不会允许,因为在完整对象Input
中的任何位置没有fi
子对象。
您可能需要使用虚拟基类:
class Input : public virtual IOBase { /* ... */ };
class FileIO : public virtual IOBase { /* ... */ };
class FileInput : public Input, public FileIO { /* ... */ };
然后你的电话中不需要演员。