指向友元函数中基 class 参数类型的指针

Pointer to base class-argument type in friend function

我正在编写一个涉及多态性的 C++ 程序。我需要重载运算符 "<<"">>" 作为友元函数。 我有基数 class base 和 3 个派生的 classes: der1,der2,der3 和指向基数 class * p 的指针。如果我将函数声明为

istream &operator>>(istream &i,der1 &d1) {...}
istream &operator>>(istream &i,der2 &d2) {...}
istream &operator>>(istream &i,der3 &d3) {...}

并称他们为

base *p;
p=new der1;
cin>>p;

程序无法编译,因为没有带有 base 参数的函数。 但是如果我这样声明,如果实际对象的类型是 der1,[= 则没有任何区别22=]der2der3, 尽管我希望它根据目的。 我能想到的就是在 base 中创建一个虚函数,并用继承的 classes 覆盖它。但是因此,我必须将这些函数称为

*p>>cin

看起来不太自然。 我该如何解决这个问题?

不要试图让 operator>> 成为会员。您不能并且仍然将 cin 保留在左侧。只需使其成为一个自由函数并让它调用一个成员(然后可以是虚拟的):

struct base { virtual void read(istream &i); };

istream &operator>>(istream &i,base &b) {b.read(i); return i;}

您可以为基础 class 创建一个 operator>>:

istream &operator>>(istream &i, base *b) {
    b->ReadFromIstream(i);
    return i;
}

然后你使 ReadFromIstream 成为一个虚函数,并从派生的 classes 中重载它。这样你就有了相同的语法 cin >> p,并且它们的行为根据 p.

的类型而不同

我认为您对 C++ 运行时间能力抱有幻想 :-)。 C++ 运行 时间不能(或选择不)查看您的基指针参数是否指向派生——多态性取决于 "calling object",而不是参数对象。如果你说 p->f() *p 中的代码将知道要调用什么,但是在 ::f(p) 中没有代码可以内省 *p 并决定调用哪个 f .该决定是在编译时根据 p 的静态类型做出的。

也就是说,解决方法是@DarkFalcon 描述的策略。从函数中调用对象的虚方法。