父類的友元不會自動成為子類的友元;而且友元會破壞封裝;C++的語方不允許(非成員)友元函數為虛函數。
但是,某些時候,必須通過友元才能實現一些操作符重載,如operator<<();如果為每個子類都實現operator<<()倒是一個可行的方法,但是顯得很啰嗦。
如果能把友元定義為虛函數,則子類可以繼承該友元的接口而無需重復聲明友好那該多好???
本文則通過一種變通的方法巧妙達到虛函數的效果。
//基類 Base.
#pragma?once
#include?
<
iostream
>
using
?
namespace
?std;
class
?Base
{
public
:
??Base(
void
);
??
~
Base(
void
);
public
:
??
virtual
?
void
?print(ostream
&
?output)?
=
?
0
;
??friend?ostream
&
?
operator
?
<<
(ostream
&
?output,Base
&
?obj);
private
:
??
char
*
?name_;
??
int
?age_;
}
;
基類的實現 base.cpp
#include?"StdAfx.h"
#include?".\base.h"
Base::Base(void)

{
??name_?=?"This?is?data1";
??age_?=?18;
}
Base::~Base(void)

{
}
void?Base::print(ostream&?output)

{
??output<<"name?=?"?<<name_<<endl;
??output<<"age?=?"<<age_<<endl;
}
ostream&?operator<<(ostream&?output,Base&?obj)

{
??obj.print(output);
??return?output;
}派生類的 Derived.h
#pragma?once
#include?"Base.h"
class?Derived?:public?Base

{
public:
??Derived(int?score?=?80);
??~Derived(void);
??virtual?void?print(ostream&?output);
private:
??int?score_;
};
派生類的實現 Derived.cpp
#include?"StdAfx.h"
#include?".\derived.h"
Derived::Derived(int?score):score_(score)

{
??
}
Derived::~Derived(void)

{
}
void?Derived::print(ostream&?output)

{
??Base::print(output);
??output<<"score?=?"<<score_<<endl;
}主程序main.cpp
//?Test_VirtualFirendFunction.cpp?:?Defines?the?entry?point?for?the?console?application.
//
#include?"stdafx.h"
#include?<iostream>
#include?"Derived.h"
using?namespace?std;
int?_tmain(int?argc,?_TCHAR*?argv[])

{
??Derived??d;
??Derived??d2(90);
??cout<<d<<endl<<d2<<endl;
????return?0;
}

屏幕輸入結果
name?=?This?is?data1
age?=?18
score?=?80
name?=?This?is?data1
age?=?18
score?=?90
結果:
任何從Base派生類的,都可以利用cout<<obj的機制通過流進行輸出。
同樣道理,也可以利用此方法實現ACE_InputCDR??/ ACE_OutputCDR對網絡操作序列化操作。
(本文也是回答某網友關于派生類不能重載的問題的回復)


