class Base1 {
public:
Base1() { cout << "Base1::Base1 1"<<endl; };
Base1(int i, int j) :i(i), j(j) {
cout << "Base1::Base1 2"<<endl ;
};
~Base1() {
cout << "Base1::~Base1"<<endl;
}
void basemem() { cout << i <<","<< j<<endl; };
protected:
int i;
private:
int j;
};
struct public_derived : public Base1
{
public:
public_derived() { cout << "public_derived::public_derived 1" << endl; };
public_derived(int i, int j, int k) : Base1(i, j), k(k) { cout << "public_derived::public_derived 2" << endl; };
int use_base() { return i; }
~public_derived() { cout << "public_derived::~public_derived" << endl; };
protected:
int k;
};
public_derived d2(5,7,8);
直接定义对象,在超出对象的范围时,会先自动调用派生类的析构函数再调用基类的析构函数;
若基类析构函数不是虚函数,则当基类指针或引用指向动态生成的派生类对象,并通过该指针delete该对象时,派生类的析构函数并不会执行,为了派生类析构函数执行,基类的析构函数需要声明为虚函数;
Base1 *bp;
bp = new public_derived(5, 7, 8);
delete bp;