测试1
测试源码
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;
}
测试结果
原因分析
pBase虽然指向的是B的地址,但是它的类型是A*,由于A的Print()函数不是虚函数,因此无法多态,直接调的是A的print()函数。
测试2
测试源码
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;
}
测试结果
原因分析
Print()函数本身虽然不是虚函数,但是调到A的Print(),然后调到Print1的时候,发现是虚函数,就用上多态了。
进一步说明
其实测试2完全等同于以上代码,以上代码中A的Print()函数声明为虚函数,在B类中未重新实现,则调的还是A得Print(),然后使用多态调到B的Print1()。
也就是说如果一个函数只有部分子函数需要重新实现,那么该函数本身可以不声明为虚函数,或者声明为虚函数但是在子类里面不override就行。
如果用到了this指针呢,对多态有影响吗?
测试源码
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; } // 在非虚函数里面传出了this指针
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;
}
测试结果
结论
在父类的非虚函数里面传递出了this指针,该指针在被使用的时候,同样具有多态的性质。