一、默认构造函数
子类构造函数如果没有显式调用基类的构造函数,会自动调用基类的无参构造函数。而如果基类只有带参数的构造函数,则会报错。不一定要显式的无参构造函数,可以显式调用基类带参数的构造函数。
class Base{
public:
Base(int c){cout<< "基类带参构造函数" << c << endl;}
~Base(){cout<<"基类析构" << endl;}
};
class Derived:public Base{
public:
Derived(int c):Base(c) // 显式调用基类构造函数
{
cout<< "派生类带参构造函数" << c << endl;
}
~Derived(){cout<<"派生类析构" << endl;}
};
int main()
{
int i = 9;
Derived d1(i);
return 0;
}
二、虚析构函数
若基类析构函数未定义为虚函数,则父类指针指向子类对象。析构的时候便不会调用子类的析构函数,从而导致内存泄漏。
class Base {
public:
Base() { cout << "基类默认构造函数" << endl; }
~Base() { cout << "基类析构" << endl; }
};
class Derived :public Base {
public:
Derived()
{
cout << "派生类构造函数" << endl;
}
~Derived() { cout << "派生类析构" << endl; }
};
int main()
{
int i = 9;
Base * base = new Derived();
delete base;
base = NULL;
system("pause");
return 0;
}
如图,子类对象未完成析构,内存泄漏。