从子类到具有相同基数

时间:2017-04-04 23:30:58

标签: c++ casting abstract-class derived-class

是否有可能隐式地将派生类转换为使用公共基础派生的抽象,而无需首先转换为基数?

示例:

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
}

请注意,readwrite方法不能是常量。

1 个答案:

答案 0 :(得分:1)

您的FileIO并非来自Input,因此不仅可以省略演员表,而且演员实际上甚至不会允许,因为在完整对象Input中的任何位置没有fi子对象。

您可能需要使用虚拟基类:

class Input : public virtual IOBase { /* ... */ };
class FileIO : public virtual IOBase { /* ... */ };

class FileInput : public Input, public FileIO { /* ... */ };

然后你的电话中不需要演员。