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