指向友元函数中基 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=]der2 或 der3, 尽管我希望它根据目的。
我能想到的就是在 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 描述的策略。从函数中调用对象的虚方法。
我正在编写一个涉及多态性的 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=]der2 或 der3, 尽管我希望它根据目的。 我能想到的就是在 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 描述的策略。从函数中调用对象的虚方法。