面试题(C++09:Autodesk)
1. 在類的普通成員函數(shù)中調(diào)用虛函數(shù),情況是怎么樣的??????
? 具體來(lái)說(shuō),問(wèn)題如下:???????
? 在類的普通成員函數(shù)fun1中調(diào)用了本類中的虛函數(shù)vfun2。 ? ? 如果在外部有該類的對(duì)象指針pobj,或者對(duì)象obj,或者應(yīng)用robj;?????
??a.???? 那么pobj-〉fun1();調(diào)用的是vfun2的虛函數(shù)(可能是派生類中的vfun2),還是說(shuō)調(diào)用的是vfun2在本類中的定義????
??b.???? 那么obj.fun1();調(diào)用的是vfun2的虛函數(shù)(可能是派生類中的vfun2),還是說(shuō)調(diào)用的是vfun2在本類中的定義?????
??c.????? 那么robj.fun1();調(diào)用的是vfun2的虛函數(shù)(可能是派生類中的vfun2),還是說(shuō)調(diào)用的是vfun2在本類中的定義???
答:
如果調(diào)用虛函數(shù)的實(shí)體是這個(gè)類的, 那么應(yīng)該調(diào)用本類中的定義。
對(duì)于虛函數(shù)來(lái)說(shuō),是根據(jù)所調(diào)用 的實(shí)體來(lái)動(dòng)態(tài)確定所調(diào)用的函數(shù)定義的。
對(duì)于非虛函數(shù)來(lái)說(shuō),用指針調(diào)用時(shí), 是根據(jù)指針類型確定調(diào)用函數(shù)的。
Test Example :
#include <iostream>
using namespace std;
class Base
{
????? public:
???????????? Base() { cout << "Base" << endl; }
???????????? ~Base() { cout << "~Base" << endl; }
????????????
???????????? virtual void func1() { cout << "func1 in Base" << endl; }
???????????? void func3() {cout << "func3 in Base" << endl;}
};
class Derived : public Base
{
????? public:
???????????? Derived() : Base() {cout << "Derived" << endl;}
???????????? ~Derived() { cout << "~Derived" << endl; }
????????????
???????????? virtual void func1() { cout << "fun1 in Derived" << endl; }
????????????
???????????? void func2() { func1(); }
????????????
???????????? void func3() {cout << "func3 in Derived" << endl;}
};
class Derived2 : public Derived
{
public:
???????????? Derived2() : Derived() {cout << "Derived2" << endl;}
???????????? ~Derived2() { cout << "~Derived2" << endl; }
????????????
???????????? virtual void func1() { cout << "fun1 in Derived2" << endl; }
????????????
???????????? void func3() {cout << "func3 in Derived2" << endl;}?????
};
int main()
{
//??? Derived *pobj = new Derived(); // 1 step
??? Derived *pobj = new Derived2(); // 2 step
??? cout << "Pointer output" << endl;
??? pobj->func2();
???
??? Derived obj;
??? cout << "Object output" << endl;
??? obj.func2();
???
??? Derived2 obj2;
//??? Derived &robj = obj; // 1 step
??? Derived &robj = obj2; // 2 step
??? cout << "Reference ouput" << endl;
??? robj.func2();
???
??? cout << "test non-virutal function" << endl;
??? Base *pBase = NULL;
??? pBase = new Derived();
??? pBase->func3(); // Output :func3 in Base
???
??? pBase = new Derived2();
??? pBase->func3(); // Output :func3 in Base
???
??? getchar();
}
2. 成員變量初始化順序,幾個(gè)有依賴關(guān)系的成員變量要初始化
答:
a. 成員變量的初始化順序只與變量在類中的聲明順序有關(guān),與在構(gòu)造函數(shù)中的初始化列表的順序無(wú)關(guān)。
class Test
{
private :
int n1;
int n2;
public:
Test();
};
Test::Test() : n2(2), n1(1)
{};
當(dāng)查看相關(guān)匯編代碼時(shí),就能看到正確的初始化順序了。
因?yàn)槌蓡T變量的初始化次序是根據(jù)變量在內(nèi)存中次序有關(guān),而內(nèi)存中的排列順序早在編譯期就根據(jù)變量的定義次序決定了.
從全局看,變量的初始化順序就應(yīng)該是:
a,基類的靜態(tài)變量或全局變量
b,派生類的靜態(tài)變量或全局變量
c,基類的成員變量
d,派生類的成員變量
3, 寫一個(gè)雙鏈表, 及常用操作(添加/刪除)
轉(zhuǎn)自了以下資源: http://hi.baidu.com/caijiamx/blog/item/4110288b46d317dbfc1f10a5.html
http://hi.baidu.com/chen3900/blog/item/8466e45d1060cb44fbf2c0c9.html
雙向鏈表(Double Linked List)
??? 雙(向)鏈表中有兩條方向不同的鏈,即每個(gè)結(jié)點(diǎn)中除next域存放后繼結(jié)點(diǎn)地址外,還增加一個(gè)指向其直接前趨的指針域prior。
注意:
??? ①雙鏈表由頭指針head惟一確定的。
??? ②帶頭結(jié)點(diǎn)的雙鏈表的某些運(yùn)算變得方便。
??? ③將頭結(jié)點(diǎn)和尾結(jié)點(diǎn)鏈接起來(lái),為雙(向)循環(huán)鏈表。
b、雙向鏈表的結(jié)點(diǎn)結(jié)構(gòu)和形式描述
①結(jié)點(diǎn)結(jié)構(gòu)(見(jiàn)上圖a)
?????
②形式描述
??? typedef struct dlistnode{
???????? DataType data;
???????? struct dlistnode *prior,*next;
????? }DListNode;
??? typedef DListNode *DLinkList;
??? DLinkList head;
c、雙向鏈表的前插和刪除本結(jié)點(diǎn)操作
??? 由于雙鏈表的對(duì)稱性,在雙鏈表能能方便地完成各種插入、刪除操作。
①雙鏈表的前插操作
????
??? void DInsertBefore(DListNode *p,DataType x)
????? {//在帶頭結(jié)點(diǎn)的雙鏈表中,將值為x的新結(jié)點(diǎn)插入*p之前,設(shè)p≠NULL
??????? DListNode *s=malloc(sizeof(DListNode));//①
??????? s->data=x;//②
??????? s->prior=p->prior;//③
??????? s->next=p;//④
??????? p->prior->next=s;//⑤
??????? p->prior=s;//⑥
?????? }
②雙鏈表上刪除結(jié)點(diǎn)*p自身的操作
????
??? void DDeleteNode(DListNode *p)
????? {//在帶頭結(jié)點(diǎn)的雙鏈表中,刪除結(jié)點(diǎn)*p,設(shè)*p為非終端結(jié)點(diǎn)
????????? p->prior->next=p->next;//①
????????? p->next->prior=p->prior;//②
????????? free(p);//③
????? }
注意:
??? 與單鏈表上的插入和刪除操作不同的是,在雙鏈表中插入和刪除必須同時(shí)修改兩個(gè)方向上的指針。
??? 上述兩個(gè)算法的時(shí)間復(fù)雜度均為O(1)。
4. 寫個(gè)is-a和has-a
class Car
{
};
class BMW : public Car
{
};
class Person
{
Car *oneCar;
};
5. struct vs. class區(qū)別:
a, 成員的默認(rèn)訪問(wèn)屬性: struct 是 public; class 是private;
b, 類的默認(rèn)繼承屬性:struct 是 public; class 是 private;
c, class 可以作為泛型的類型的聲明的關(guān)鍵字。struct 不能;
轉(zhuǎn)載于:https://www.cnblogs.com/happylife/archive/2009/09/27/1575237.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的面试题(C++09:Autodesk)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 继承之接口知识点和思考练习
- 下一篇: 北京环球影城门票多少钱