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(使用工厂)。