C++ 如何对指向基类的指针执行I/O操作?

C++ 如何对指向基类的指针执行I/O操作?,c++,io,C++,Io,例如,我有一个基类a及其派生类B,C,等等。我有一个指针指向a的数据。它可能是newb,newc,等等。有没有简单的方法来读写指向流的指针?我的问题是如何了解具体类型。一个例子来说明我的意思 struct A { int i; }; struct B : public A { char c; }; struct C : public A { float f; } struct Data { unique_ptr<A> mA; }; Data data

例如,我有一个基类
a
及其派生类
B
C
,等等。我有一个指针指向
a
的数据。它可能是
newb
newc
,等等。有没有简单的方法来读写指向流的指针?我的问题是如何了解具体类型。一个例子来说明我的意思

struct A            { int i; };
struct B : public A { char c; };
struct C : public A { float f; }

struct Data
{
    unique_ptr<A> mA;
};

Data data;
结构A{int i;}; 结构B:公共A{char c;}; 结构C:公共A{float f;} 结构数据 { 独特的ptr-mA; }; 数据;
用户处理
数据
,然后将其写入文件并从文件中读取。

答案是您不需要,您使用的是虚拟函数

#include <iostream>

struct A {
    int i;
    virtual void describe() {
        std::cout << "A:" << i << std::endl;
    }
};
struct B : public A {
    char c;
    virtual void describe() override {
        // Assume a 'B' wants to also output the A stuff.
        std::cout << "B:" << c << ":";
        A::describe();
    }
};
struct C : public B {
    float f;
    virtual void describe() override {
        // Assume a 'C' wants to also output the B stuff and A stuff.
        std::cout << "C:" << f << ":";
        B::describe();
    }
};

#include <vector>

int main() {
    std::vector<A*> bar;
    A a;
    a.i = 10;
    B b;
    b.i = 22;
    b.c = 'b';
    C c;
    c.i = 5;
    c.c = 'X';
    c.f = 123.456;
    bar.push_back(&a);
    bar.push_back(&b);
    bar.push_back(&c);
    for (size_t i = 0; i < bar.size(); ++i) {
        bar[i]->describe();
    }
}
#包括
结构A{
int i;
虚拟空描述(){

std::cout封装的要点是您通常不需要知道。如果您想要一些特殊的行为,只需在中声明一个虚拟函数,并根据需要在派生类中重写。如果这没有帮助,那么我建议您定义“写入和读取指向/来自流的指针”.我同意Jonathan的观点。完全一样?只需添加一个函数参数,并确保函数之间的一致性。
virtual void read(istream&from);
virtual void read(istream&from)重写派生类中的
。必须先构造对象,然后才能开始读入,因此vtable已就位。如果您要问“如何在开始读入之前有一个指向正确对象的指针”,这应该是它自己的问题(可能已经被问过)。但在某个时候,您必须有足够的信息来说明您处于何种状态。您可以先编写一个类型指示符,以便在开始读取之前构造正确的类型,并使用一个switch语句或哈希映射type->constructor(使用工厂)。