1.考察虛繼承內(nèi)存體系
class A
{
public:
A() { cout<<"Construct A"<
~A() { cout<<"Destruct A"<
void speak() { cout<<"A is speaking!"<
};
class B:public virtual A
{
public:
B() { cout<<"Construct B"<
~B() { cout<<"Destruct B"<
};
class C:public virtual A
{
public:
C() { cout<<"Constuct C"<
~C() { cout<<"Destruct C"<
};
class D:public B, public C
{
public:
D(){ cout<<"Constsruct D"<
~D(){ cout<<"Destruct D"<
};
int main()
{
D *p = new D();
p->speak();
delete p;
}
輸出:
Construct A
Construct B
Constuct C
Constsruct D
A is speaking!
Destruct D
Destruct C
Destruct B
Destruct A
2.考察非虛析構(gòu)函數(shù)這道題
class Parent
{
public:
Parent(){cout<<"Parent construct"<
~Parent(){ cout<<"Parent destruct "<
};
class Child : public Parent
{
public:
Child() { cout<<"Child construct "<
~Child() {cout<<"child destruct"<
};
int main()
{
Parent *p;
Child *c = new Child();
p = c;
delete p; // 因?yàn)槲鰳?gòu)函數(shù)是非 virtual 的,故析構(gòu)的時(shí)候按照指針的類型進(jìn)行析構(gòu)
}
輸出:
Parent construct
Child Construct
Parent destruct
3.考察初始化列表的寫法
class A
{
public:
A(int x, int y, int z):a=x,b=y,c=z {} (1)
A(int x, int y, int z):a(x),b(y),c(z){} (2)
private:
int a;
int b;
int c;
};
int main()
{
A a(1,2,3);
}
第 1 種寫法是錯(cuò)誤的,第 2 種正確。
4.考察拷貝構(gòu)造函數(shù)和賦值的區(qū)別。
class A
{
public:
A() { cout<<"Construct A by default"<
A(const A& a) { cout<<"consttuct A by copy"<
A& operator =(const A& a) { cout<<"cosnt A by operator ="<
~A() { cout<<"Destruct A"<
};
int main()
{
A a;
A b=a; //調(diào)用拷貝構(gòu)造函數(shù)
A c(a); //調(diào)用拷貝構(gòu)造
A d;
d=a; //賦值
}
輸出:
Construct A by default //構(gòu)造對象 a
consttuct A by copy //拷貝構(gòu)造 b
consttuct A by copy //拷貝構(gòu)造 c
Construct A by default //構(gòu)造 a
cosnt A by operator = //賦值 d=a
Destruct A
Destruct A
Destruct A
Destruct A
5.考察函數(shù)指針
voidfunc(char* a)
{
cout<
}
int main()
{
void (*fp)(char*); //填空處
fp = func; //函數(shù)名func相當(dāng)于函數(shù)的地址,將其賦給函數(shù)指針fp
char* s="helloc";
fp(s);
}