#include <iostream> using namespace std; class A { public: A() : m_ival(0) { test(); } virtual void func() { cout << m_ival << endl; } void test() { func(); } public: int m_ival; }; class B : public A { public: B() { test(); } void func() { ++ m_ival; cout << m_ival << endl; } }; int main() { A* p = new B; p->test(); delete p; return 0; }
問 1:分析下面的程序,給出運行結果
輸出:ios
0 1 2
問 二 :在子類與父類構造函數中都調用test(), 那麼編譯器是怎麼肯定應該調用的哪一個 func() 函數版本呢?
相關概念:面試
發生了什麼?算法
在構造 A 部分時:函數
在構造 B 部分時:學習
總結:spa
問 三:上述的代碼是否有其它問題?
問題 2指針
要點
HR 問:編寫代碼將一個鏈表反轉打印
面試者:須要思考的問題code
struct Node { int v; struct Node* next; };
void reversse_display_list(struct Node* list) { if( list ) { reversse_display_list(list->next); printf("%d ", list->v); } }
void reversse_display_list_stack(struct Node* list) { if( list ) { LinkStack<int> stack; while( list ) // O(n) { stack.push(list->v); list = list->next; } while( stack.size() > 0 ) // O(n) { printf("%d ", stack.top()); stack.pop(); } printf("\n"); } }
struct Node* reverse_list(struct Node* list) // O(n) { if( list ) { struct Node* guard = NULL; struct Node* next = list->next; while( next ) { list->next = guard; guard = list; list = next; next = list->next; } list->next = guard; } return list; }
要點
不用加減乘除運算符作整數加法
面試者: 須要思考的問題對象
int add_1(int a, int b) { int ret = 0; asm volatile ( "movl %%eax, %%ecx\n" "addl %%ebx, %%ecx\n" : "=c"(ret) : "a"(a), "b"(b) ); return ret; } int add_2(int a, int b) { int part = 0; int carry = 0; do { part = a ^ b; carry = (a & b) << 1; a = part; b = carry; } while( b != 0 ); return a; }
要點