7-30复习 多态
如果子類定義了與父類中原型相同的函數會發生什么?
函數重寫
在子類中定義與父類中原型相同的函數
函數重寫只發生在父類與子類之間
重載與重寫區別:
重載:同一個作用域;
??????子類無法重載父類函數,父類同名函數將被覆蓋;
??????重載是在編譯期間根據參數類型和個數決定;
重寫:發生于父類、子類之間;
??????父類和子類函數有相同的函數原型;
??????使用virtual關鍵字聲明后能夠產生多態;
??????運行期間根據具體對象類型決定調用的函數。
?----注意:
根據實際的對象類型來判斷重寫函數的調用
如果父類指針指向的是父類對象則調用父類中定義的函數
?如果父類指針指向的是子類對象則調用子類中定義的重寫函數
?
/*
#include <iostream>
#include <windows.h>
using namespace std;
class A
{
public:
?? ?void print()
?? ?{
?? ??? ?cout << "AAAAA" << endl;
?? ?}
};
class B : public A
{
public:
?? ?void print()
?? ?{
?? ??? ?cout << "BBBBB" << endl;
?? ?}
};
int main()
{
?? ?A *pa = new A;?? ??? ??? ?//基類指針指向基類對象
?? ?pa->print();
?? ?delete pa;
?? ?pa = new B;?? ??? ??? ??? ?//基類指針指向派生類對象
?? ?pa->print();?? ??? ??? ?//輸出還是A 編譯時就決定了 ?因為指針類型是 A
?? ?system("pause");
?? ?return 0;
}
*/
/*
#include <iostream>
#include <windows.h>
using namespace std;
class A
{
public:
?? ?virtual void print()
?? ?{
?? ??? ?cout << "AAAAA" << endl;
?? ?}
};
class B : public A
{
public:
?? ?void print()
?? ?{
?? ??? ?cout << "BBBBB" << endl;
?? ?}
};
int main()
{
?? ?A *pa = new A;?? ??? ?//基類指針指向基類對象
?? ?pa->print();
?? ?delete pa;
?? ?pa = new B;?? ??? ??? ?//基類指針指向派生類對象
?? ?pa->print();?? ??? ?//輸出是B 這時候基類的print函數為虛函數 繼承時隱藏了
?? ?system("pause");
?? ?return 0;
}
*/
/*
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
?? ?int m_a;
?? ?~A()
?? ?{
?? ??? ?cout << "~~A" << endl;
?? ?}
};
class A1 :virtual public A
{
public:
?? ?int m_a1;
?? ?A1(int a1)
?? ?{
?? ??? ?m_a1 = a1;
?? ??? ?cout << "A1" << endl;
?? ?}
?? ?~A1()
?? ?{
?? ??? ?cout << "~~A1" << endl;
?? ?}
};
class A2 :virtual public A
{
public:
?? ?int m_a2;
?? ?A2(int a2)
?? ?{
?? ??? ?m_a2 = a2;
?? ??? ?cout << "A2" << endl;
?? ?}
?? ?~A2()
?? ?{
?? ??? ?cout << "~~A2" << endl;
?? ?}
};
class C :public A1, public A2
{
public:
?? ?int m_c;
?? ?C() : A1(1), A2(2)
?? ?{
?? ??? ?
?? ??? ?cout << "CCCCCCCCC" << endl;
?? ?}
?? ?~C()
?? ?{
?? ??? ?cout << "~~CCCCCCCCC" << endl;
?? ?}
};
int main()
{
?? ?C b;
?? ?A *pa = &b;
?? ?A1 *pa1 = &b;
?? ?A2 *pa2 = &b;
?? ?cout << &b << endl;
?? ?cout << pa << endl;
?? ?cout << pa1 << endl;
?? ?cout << pa2 << endl;
?? ?cout << "************" << endl;
?? ?system("pause");
?? ?return 0;
}
*/
/*
#include <iostream>
#include <windows.h>
using namespace std;
class A
{
protected:
int m_len;
public:
A(int l);
virtual ~A();?? ??? ??? ??? ?//虛析構函數 作用;父類指針釋放子類空間
};
A::A(int l)
{
cout << "constuctor A ok ~" << endl;
m_len = l;
}
A::~A()
{
cout << "destuct A ok~" << endl;
}
class Array : public A
{
private:
char *m_data;
public:
Array();
~Array();
};
Array::Array() : A(5)
{
m_data = new char[m_len];
cout << "constuct Array ok ~" << endl;
}
Array::~Array()
{
delete m_data;
cout << "destuctr Array ok ~" << endl;
}
int main()
{
A *a1 = new Array;
delete a1;
cout << &a1 << endl;
system("pause");
return 0;
}
*/
//***************virtual 加在 public 繼承上 就是 虛指針
//************virtual 加在 基類函數 上 就是 虛函數表指針
/*
#include <iostream>
#include <windows.h>
using namespace std;
class A
{
protected:
?? ?int m_a;
public:
?? ?A();
?? ?virtual void print();
};
A::A()
{
?? ?m_a = 1;
}
void A::print()
{
?? ?
}
class B : public A
{
private:
?? ?int m_b;
public:
?? ?B(int b);
?? ?void print();
};
B::B(int b)
{
?? ?m_b = b;
}
void B::print()
{
?? ?cout << "m_b = " << m_b << endl;
}
int main()
{
?? ?B b[5] = {B(1),B(2), B(3),B(4), B(5)}; //派生類對象數組
?? ?//每個B里有三個元素 一個指針 一個m_a 一個m_b
?? ?A *pa = b;//不能用基類指針指向派生類數組,因為步長不一樣
?? ?//b[2].print();
?? ?//pa[2].print();//訪問會出錯
?? ?cout << pa << endl;
?? ?cout << b << endl;
?? ?cout << pa + 1 << endl;
?? ?cout << b + 1 << endl;
?? ?system("pause");
?? ?return 0;
}
*/
/*
#include <iostream>
#include <windows.h>
using namespace std;
class A?? ??? ??? ??? ??? ??? ?//含有純虛函數的類 叫做 抽象類 ?//所以抽象類 無法創建對象
{
protected:
?? ?int m_a;
public:
?? ?A();
?? ?virtual void print() = 0;//純虛函數 要求任何派生類都要定義 自己的版本
?? ??? ??? ??? ??? ??? ??? ??? ?//如果 派生類不實現 那么 她還是一個抽象類
};
A::A()
{
?? ?m_a = 1;
}
class B : public A
{
private:
?? ?int m_b;
public:
?? ?B(int b);
?? ?void print();
};
B::B(int b)
{
?? ?m_b = b;
}
void B::print()
{
?? ?cout << "m_b = " << m_b << endl;
}
int main()
{
?? ?B b[5] = { B(1), B(2), B(3), B(4), B(5) }; //派生類對象數組
?? ?//每個B里有三個元素 一個指針 一個m_a 一個m_b
?? ?A *pa = b;//不能用基類指針指向派生類數組,因為步長不一樣
?? ?//b[2].print();
?? ?//pa[2].print();//訪問會出錯
?? ?cout << pa << endl;
?? ?cout << b << endl;
?? ?cout << pa + 1 << endl;
?? ?cout << b + 1 << endl;
?? ?system("pause");
?? ?return 0;
}
*/
總結
- 上一篇: 7-28作业直接刷一下
- 下一篇: 实现数组的模板类