C++ 中具有友元函数的多态性
Polymorphism with a friend function in C++
我想结合多态和友情的概念。我正在使基 class 的纯虚拟成员函数成为另一个 class 的朋友。然后,我想在从该基 class 派生的 classes 中覆盖这个纯虚拟成员函数,并访问具有 friend 等功能的 class 的私有成员数据。请参阅下面的代码片段。当我在派生的 classes 成员函数 add()
中引用 my_int
时,编译器会报错。我知道友谊是一对一的关系,但我想知道是否有任何方法可以实现多态性。我是否只需要使 classes 的不同派生的成员函数成为 foo()
class 的朋友?
class foo {
private:
int my_int{};
public:
friend virtual int base::add();
};
class base {
public:
virtual int add() = 0;
};
class derived_1 : public base {
public:
int add() {
return my_int + 1;
}
};
class derived_2 : public base {
public:
int add() {
return my_int + 2;
}
}
你可能想看这里:
https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Virtual_Friend_Function
Intent
Simulate a virtual friend function.
Solution and Sample Code
Virtual friend function idiom makes use of an extra indirection to
achieve the desired effect of dynamic binding for friend functions. In
this idiom, usually there is only one function that is a friend of the
base class of the hierarchy and the friend function simply delegates
the work to a helper member function that is virtual. The helper
function is overridden in every derived class, which does the real job
and the friend function just serves as a facade.
class Base {
public:
friend ostream& operator << (ostream& o, const Base& b);
// ...
protected:
virtual void print(ostream& o) const
{ ... }
};
/* make sure to put this function into the header file */
inline std::ostream& operator<< (std::ostream& o, const Base& b)
{
b.print(o); // delegate the work to a polymorphic member function.
return o;
}
class Derived : public Base {
protected:
virtual void print(ostream& o) const
{ ... }
};
首先,对于您所显示的内容,它不会起作用,因为 my_int 是 foo 的成员,但在基础 class 树中没有 'foo' 来获取成员来自。
简单的答案是让函数接受一个 int 参数并完全取消使用 friend。
struct derived2 : base
{
int add(int arg) { return arg + 2; }
};
'friend' 的使用应该让你认真地质疑你所做的是否是一个好的答案,有时这个问题的答案是 'yes' 但并不常见。你需要的朋友越多,答案就越少'yes'。
另一种方法是向基础添加一个函数:
int get_arg(foo & f) { return f.my_int; }
并使该函数成为朋友而不是添加,将从每个派生的 add() 调用 get_arg() 以获得要使用的值,但 get_arg 本身不是虚拟的.
我想结合多态和友情的概念。我正在使基 class 的纯虚拟成员函数成为另一个 class 的朋友。然后,我想在从该基 class 派生的 classes 中覆盖这个纯虚拟成员函数,并访问具有 friend 等功能的 class 的私有成员数据。请参阅下面的代码片段。当我在派生的 classes 成员函数 add()
中引用 my_int
时,编译器会报错。我知道友谊是一对一的关系,但我想知道是否有任何方法可以实现多态性。我是否只需要使 classes 的不同派生的成员函数成为 foo()
class 的朋友?
class foo {
private:
int my_int{};
public:
friend virtual int base::add();
};
class base {
public:
virtual int add() = 0;
};
class derived_1 : public base {
public:
int add() {
return my_int + 1;
}
};
class derived_2 : public base {
public:
int add() {
return my_int + 2;
}
}
你可能想看这里:
https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Virtual_Friend_Function
Intent
Simulate a virtual friend function.
Solution and Sample Code
Virtual friend function idiom makes use of an extra indirection to achieve the desired effect of dynamic binding for friend functions. In this idiom, usually there is only one function that is a friend of the base class of the hierarchy and the friend function simply delegates the work to a helper member function that is virtual. The helper function is overridden in every derived class, which does the real job and the friend function just serves as a facade.
class Base { public: friend ostream& operator << (ostream& o, const Base& b); // ... protected: virtual void print(ostream& o) const { ... } }; /* make sure to put this function into the header file */ inline std::ostream& operator<< (std::ostream& o, const Base& b) { b.print(o); // delegate the work to a polymorphic member function. return o; } class Derived : public Base { protected: virtual void print(ostream& o) const { ... } };
首先,对于您所显示的内容,它不会起作用,因为 my_int 是 foo 的成员,但在基础 class 树中没有 'foo' 来获取成员来自。
简单的答案是让函数接受一个 int 参数并完全取消使用 friend。
struct derived2 : base
{
int add(int arg) { return arg + 2; }
};
'friend' 的使用应该让你认真地质疑你所做的是否是一个好的答案,有时这个问题的答案是 'yes' 但并不常见。你需要的朋友越多,答案就越少'yes'。
另一种方法是向基础添加一个函数:
int get_arg(foo & f) { return f.my_int; }
并使该函数成为朋友而不是添加,将从每个派生的 add() 调用 get_arg() 以获得要使用的值,但 get_arg 本身不是虚拟的.