就職面接--ノートの復習2

1937 ワード

1、c++では、classとstructの違いは何ですか.参考:クリックしてリンクを開く
2、初期化リストとコンストラクション関数の初期化の違いは何ですか?
3、C++の虚継承と継承の違いは何ですか?参考:クリックしてリンクを開く
4、虚関数の実現原理?
事例コード:
#include <iostream>
using namespace std;


class Base
{
public:
	virtual void f()
	{
		cout << "Base::f" <<endl;
	}

	virtual void g()
	{
		cout << "Base::g" <<endl;
	}

	virtual void h()
	{
		cout << "Base::h" <<endl;
	}
};

int main()
{
	typedef void (*Fun)(void);
	Base b;
	Fun pFun = NULL;
	cout << "       :" << (int*)(&b) <<endl;
	cout << "    ----       :" << (int*)*(int*)(&b) <<endl;
	pFun = (Fun)*((int*)*(int*)(&b)+1);
	pFun();
	return 0;
}

5、虚関数として宣言できる関数は何ですか.
コンストラクション関数、インライン関数を除く非静的メンバー関数は、虚関数として宣言できます.
6、構造関数は通常虚関数として宣言されますが、なぜですか.
構造関数を虚関数として宣言する必要がある場合があります.ベースクラスポインタは派生クラスを指し、ベースクラスポインタdeleteの場合、虚関数として定義しないと、派生クラスの派生部分は解析できません.サンプルコードは次のとおりです.
#include <iostream>
using namespace std;

class CPerson
{
public:
	virtual ~CPerson();
protected:
	char* m_lpszName;
	char* m_lpszSex;
};

class CStudent:public CPerson
{
public:
	virtual ~CStudent();
protected:
	int m_iNumber;
};

CPerson::~CPerson()
{
	cout << "~CPerson!" <<endl;
}

CStudent::~CStudent()
{
	cout << "~CStudent!" <<endl;
}

int main()
{
	CPerson *p = new CStudent;
	if (NULL == p)
	{
		exit(0);
	}
	delete p;
	cout << "CStudent        "<<endl;
	return 0;
}

7、main()メイン関数の実行が完了したら、コードをもう一度実行できますか?
はい、使用できます.onexit()関数はmain()が完了した後に再実行される関数を登録します.サンプル・プログラムは次のとおりです.
#include <stdio.h>
#include <stdlib.h>

int fun()
{
	printf("after main
"); return 0; } int main() { _onexit(fun); printf("This is excuted first
"); return 0; }