資源簡介
1. 虛函數是可以[New一個對象的時候要根據虛函數的函數體來填虛表;而內聯函數沒有函數體,只是在預編譯階段展開]內聯的,這樣就可以減少函數調用的開銷,提高效率(錯誤)
2. 一個類里可以同時存在[同一個類里無論什么函數都不能函數名和參數完全一樣]參數和函數名都相同的虛函數與靜態函數(錯誤)
3. 父類的析構函數是非虛的,但是子類的析構函數是虛的,delete子類指針(指向該子類對象)[特殊情況,參見題5],會調用父類的析構函數(正確)//任何情況下刪除子類都會調用到父類的析構函數
4.對于下面的類CA,sizeof(CA) = _B_:
A. 4 B. 8 C. 12 D. 16
class CA
{
public:
CA();
virtual ~CA(); //因為有虛函數,所以會有4個字節的虛表指針
private:
int m_iTime; //成員變量4個字節
public:
int GetTime();
int SetTime(int iTime);
};
5.下面這段程序,打印結果是_A_:
A. 1 B. 2 C. 3 D. 以上都不對
int g_iCount = 0;
class CParent
{
public:
CParent() {}
~CParent() {g_iCount += 1;}
};
class CSon : public CParent
{
public:
CSon() {}
~CSon() {g_iCount += 2;}
};
main()
{
CParent* p = new CSon();
delete p[由于p被聲明成父類指針,并且父類和子類的析構函數都非虛,因此delete操作只能根據p指針聲明的類型來調用父類的析構函數];
std::cout << g_iCount << std::endl;
}
6.請問下面這段程序的輸出結果是_A_:
A. 2,1, B. 2,2, C. 1,1, D. 1,2,
class CParent
{
public:
CParent() {}
virtual ~CParent() {}
public:
virtual void Print()
{ std::cout << "1,"; };
};
class CSon : public CParent
{
public:
CSon() {};
virtual ~CSon() {};
public:
void Print()
{ std::cout << "2,"; };
};
void Test1(CParent& oParent[這里是引用了一個外部對象,該對象的虛表不會發生變化])
{oParent.Print();}
void Test2(CParent oParent[這里會在棧空間內重新構造一個CParent類的對象,如果傳入實參的類型與CParent不同則虛表會發生變化])
{oParent.Print();}
main()
{
CSon * p = new CSon();
Test1(*p); //這里只是一個引用
Test2(*p); //這里會在棧空間重新構造Cparent類對象
delete p;
}
7.請問下面這段程序的輸出結果是_D_:
A. 2,1, B. 2,2, C. 1,1, D. 1,2,
class CParent
{
public:
CParent() {}
virtual ~CParent() {}
public:
void Print(){ std::cout << "1," ; };
};
class CSon : public CParent
{
public:
CSon() {}
virtual ~CSon() {}
public:
void Print(){ std::cout <Print();
pSon->Print();[由于父類和子類的Print函數都非虛,所以根據指針類型決定調用關系]
}
8.請問下面這段程序的輸出結果是_C_:
A. 2,1, B. 2,2, C. 1,2, D. 1,1,
class CP
代碼片段和文件信息
- 上一篇:MFC鼠標位置提示框
- 下一篇:連續存儲空間管理仿真系統
評論
共有 條評論