測(cè)試1
測(cè)試源碼
class A {
public:
void Print() { Print1(); Print2(); }
private:
virtual void Print1() { cout << "A Print1" << endl; }
void Print2() { cout << "A Print2" << endl; }
};
class B : public A {
public:
void Print() { Print1(); Print2(); }
private:
void Print1() { cout << "B Print1" << endl; }
void Print2() { cout << "B Print2" << endl; }
};
int main ()
{
A *pBase = new B;
pBase->Print();
return 0;
}
測(cè)試結(jié)果
原因分析
pBase雖然指向的是B的地址,但是它的類型是A*型酥,由于A的Print()函數(shù)不是虛函數(shù)躬柬,因此無(wú)法多態(tài),直接調(diào)的是A的print()函數(shù)。
測(cè)試2
測(cè)試源碼
class A {
public:
void Print() { Print1(); Print2(); }
private:
virtual void Print1() { cout << "A Print1" << endl; }
void Print2() { cout << "A Print2" << endl; }
};
class B : public A {
public:
void Print() { Print1(); Print2(); }
private:
void Print1() { cout << "B Print1" << endl; }
void Print2() { cout << "B Print2" << endl; }
};
int main ()
{
A *pBase = new B;
pBase->Print();
return 0;
}
測(cè)試結(jié)果
原因分析
Print()函數(shù)本身雖然不是虛函數(shù)祥得,但是調(diào)到A的Print()兔沃,然后調(diào)到Print1的時(shí)候,發(fā)現(xiàn)是虛函數(shù)级及,就用上多態(tài)了乒疏。
進(jìn)一步說(shuō)明
其實(shí)測(cè)試2完全等同于以上代碼,以上代碼中A的Print()函數(shù)聲明為虛函數(shù)饮焦,在B類中未重新實(shí)現(xiàn)怕吴,則調(diào)的還是A得Print(),然后使用多態(tài)調(diào)到B的Print1()县踢。
也就是說(shuō)如果一個(gè)函數(shù)只有部分子函數(shù)需要重新實(shí)現(xiàn)转绷,那么該函數(shù)本身可以不聲明為虛函數(shù),或者聲明為虛函數(shù)但是在子類里面不override就行硼啤。
如果用到了this指針呢议经,對(duì)多態(tài)有影響嗎?
測(cè)試源碼
class A; // 前置聲明
class C {
public:
void SetPtr(A *pa);
void Print();
private:
A *m_ptr;
};
class A {
public:
A() { cObj = new C; }
~A() { delete cObj; }
virtual void Print() { Print1(); Print2(); }
virtual void Print1() { cout << "A Print1" << endl; }
void Print2() { cObj->SetPtr(this); cout << "A Print2" << endl; } // 在非虛函數(shù)里面?zhèn)鞒隽藅his指針
public:
C *cObj;
};
class B : public A {
public:
// void Print() override { Print1(); Print2(); }
void Print1() { cout << "B Print1" << endl; }
void Print2() { cout << "B Print2" << endl; }
};
void C::SetPtr(A *pa) { m_ptr = pa;}
void C::Print() { m_ptr->Print1(); m_ptr->Print2(); }
int main ()
{
A *pBase = new B;
pBase->Print();
pBase->cObj->Print();
return 0;
}
測(cè)試結(jié)果
結(jié)論
在父類的非虛函數(shù)里面?zhèn)鬟f出了this指針,該指針在被使用的時(shí)候谴返,同樣具有多態(tài)的性質(zhì)煞肾。