Q1. 下面程序的輸出結果是?
class A{
public:
A(){
cout << "A()" << endl;
}
~A(){
cout << "~A()" << endl;
}
virtual void fun(){
cout << "A:fun()" << endl;
}
};
class B: public A{
public:
B(){
cout << "B()" << endl;
}
~B(){
cout << "~B()" << endl;
}
virtual void fun(){
cout << "B:fun()" << endl;
}
};
class C: public B{
public:
C(){
cout << "C()" << endl;
}
~C(){
cout << "~C()" << endl;
}
private:
virtual void fun(){
cout << "C:fun()" << endl;
}
};
int main()
{
B b = B();
B *c = new C();
c->fun();
delete c;
}
A1.參考答案:
A()
B()
A()
B()
C()
C:fun()
~B()
~A()
~B()
~A()
Q2:設計一個只能在堆內存上實例化的類和一個只能在棧內存上實例化的類,否則出現編譯錯誤。
A2:不能在棧上實例化,而只能在堆上實例化,可以將析構函數私有化,防止自動調用析構函數,必須手動調用;
class CHeapOnly
{
public:
CHeapOnly()
{
cout << "Constructor of CHeapOnly!" << endl;
}
void Destroy() const
{
delete this;
}
private:
~CHeapOnly()
{
cout << "Destructor of CHeapOnly!" << endl;
}
};
只能在棧內存上實例化,不能在堆內存上實例化,將new和delete操作符私有化。
class CStackOnly
{
public:
CStackOnly()
{
cout << "Constructor of CStackOnly!" << endl;
}
~CStackOnly()
{
cout << "Destrucotr of CStackOnly!" << endl;
}
private:
void* operator new(size_t size)
{
}
void operator delete(void * ptr)
{
}
};