C++动态绑定及返回类型协变
C++多態之動態綁定:
?
1、概念:在程序執行期間(非編譯期)判斷所引用對象的實際類型,根據其實際類型調用相應的方法。
使用virtual關鍵字修飾類的成員函數時,指明該函數為虛函數,派生類需要重新實現,編譯器將實現動態綁定。
2、條件:a)必須是虛函數。? b)通過基類類型的引用或者指針調用虛函數。
?
?
class Base
{
public:
??? Base()
??? {
???????cout<<"Base:: Base()"<<endl;
??? }
?
??? ~Base()
??? {
??????? cout<<"Base::~Base()"<<endl;
??? }
?
??? virtual void Test1()
??? {
???????cout<<"Base:: Test1()"<<endl;
??? }
?
??? int sum(int a, int b)
??? {
??????? cout<<"Base:: sum =a+b"<<endl;
??????? return a+b;
??? }
};
?
class Derived:public Base
{
public:
??? Derived()
??? {
??????? cout<<"Derived::Derived()"<<endl;
??? }
???
??? ~Derived()
??? {
??????? cout<<"Derived::~Derived()"<<endl;
??? }
protected:? ? //基類為public
??? virtual void Test1()
??? {
???????cout<<"Derived:: Test1()"<<endl;
??? }
?
??? virtual int sum(int a, int b)
??? {
??????? cout<<"Derived:: sum= a+b"<<endl;
??????? return a+b;
??? }
?
};
?
void FunTest1(Base& b)? //通過基類的指針或引用訪問派生類的成員
{
??? b.Test1();
}
?
void FunTest()
{
??? Derived d;
??? Base b;
?
??? Base& pBase = d;
?
??? FunTest1(b);
??? FunTest1(d);
???
??? cout<<"sum = "<<pBase.sum(1,2)<<endl;
}
?
?
?
?
?
當修改了派生類中重寫的虛函數與原來的返回值不同,編譯器報錯。
?
?
故重寫(覆蓋)要求具有相同的參數和返回值。而這個規則對于協變則會放松。
?
3、協變:
在C++中,只要原來的返回類型是基類類型的指針或引用,新的返回值類型是派生類的指針或引用,覆蓋的方法就可以改變返回類型,這樣的返回類型稱為協變返回類型。
class Base
{
public:
??? Base()
??? {
???????cout<<"Base:: Base()"<<endl;
??? }
?
??? ~Base()
??? {
??? ??? cout<<"Base::~Base()"<<endl;
??? }
??? virtual Base& operator=(const Base& b)
??? {
??????? cout<<"Base::operator=(const Base& b)"<<endl;
??????? return *this;
??? }
?
};
?
class Derived:public Base
{
public:
??? Derived()
??? {
???????cout<<"Derived:: Derived()"<<endl;
??? }
???
??? ~Derived()
??? {
??????? cout<<"Derived::~Derived()"<<endl;
??? }
??? virtual Derived& operator=(const Base& b)
??? {
??????? cout<<"Derived::operator=(const Base& b)"<<endl;
??????? return *this;
??? }
?
};
?
?
void FunTest()
{
??? Derived d1,d2;
??? Base b;
?
??? Base& pBase = d1;
??? pBase.operator=(d2);
?
}
協變返回類型的優勢在于,總是可以在適當程度的抽象層面工作。目前,一般認為,返回值可以協變,參數則不可以。?
??因此,在C++標準的虛函數中,返回值協變,參數不變。
總結
以上是生活随笔為你收集整理的C++动态绑定及返回类型协变的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 缠中说禅:教你炒股票108课(转载)
- 下一篇: s3c2440移植MQTT