定义如下两个类:
class A
{
public:
A()
{
cout << "基类构造函数" << endl;
}
/*virtual*/ ~A()
{
cout << "基类析构函数" << endl;
}
virtual void func1()
{
cout << "基类函数func1" << endl;
}
void func2()
{
cout << "基类函数func2" << endl;
}
void func3()
{
this->func1();
}
};
class B:public A
{
public:
B()
{
cout << "派生类构造函数" << endl;
}
~B()
{
cout << "派生类析构函数" << endl;
}
void func1()
{
cout << "派生类函数func1" << endl;
}
void func2()
{
cout << "派生类函数func2" << endl;
}
void func3()
{
this->func1();
}
};
总结点一:
定义的对象调用自身所属类的函数成员
例:
int main()
{
A a;
B b;
cout << "*************" << endl;
a.func1();
a.func2();
a.func3();
cout << "*************" << endl;
b.func1();
b.func2();
b.func3();
cout << "*************" << endl;
return 0;
}
//输出结果:
基类构造函数
基类构造函数
派生类构造函数
*************
基类函数func1
基类函数func2
基类函数func1
*************
派生类函数func1
派生类函数func2
派生类函数func1
*************
总结点二:
- 基类的指针指向派生类的对象,指针只能操作派生类从基类中继承过来的成员函数。
- c++的多态性(虚函数),可以使得指向派生类对象的基类指针操作派生类的成员函数。
例:
int main()
{
A a;
B b;
cout << "*************" << endl;
A *p1 = &a;
p1->func1();
p1->func2();
p1->func3();
cout << "*************" << endl;
A *p2 = &b;
p2->func1();
p2->func2();
p2->func3();
return 0;
}
//输出结果:
基类构造函数
基类构造函数
派生类构造函数
*************
基类函数func1
基类函数func2
基类函数func1
*************
派生类函数func1
基类函数func2
派生类函数func1
总结点三:
- 当指向派生类对象的基类指针指向不同的对象时,要释放原先的派生类对象的内存,否则会发生内存泄漏。
- delete指向派生类对象的基类指针时,指针指向的内存必须是动态分配的,否则程序出错。
- delete指向派生类对象的基类指针时,如若基类不使用虚析构函数,编译器在delete基类指针时便只能调用基类的析构函数,而不能调用派生类的析构函数,不能释放派生类可能分配的动态内存。
例:
int main()
{
A a;
B b;
A *p3 = new B;
delete p3;
p3 = &b;
//delete p3;//错误
A *p4 = &b;
//delete p4;//错误
cout << "*************" << endl;
A *p5 = NULL;
delete p5;//当指针为NULL时,不会调用析构函数
return 0;
}
//输出结果:
基类构造函数
基类构造函数
派生类构造函数
*************
基类构造函数
派生类构造函数
基类析构函数
*************
//如若基类的析构函数是虚函数,则结果如下:
基类构造函数
基类构造函数
派生类构造函数
*************
基类构造函数
派生类构造函数
派生类的析构函数
基类析构函数
*************
解析:
- A *p3 = new B;*p3指向的内存是在堆上动态分配的需要主动释放,而b是在栈上创建的,程序结束后会自动释放。delete p3;释放了new出来的内存之后程序中已经没有动态的内存了,因此不可再delete基类指针,p4错误同理。
- delete p3;该语句必不可少,如若此时不释放该动态分配的内存(new B),执行p3 = &b;之后,将没有指针指向该段内存,便已发生了内存泄漏。
- 如若基类不使用虚析构函数,则执行delete p3;时,只能调用基类的析构函数,不能调用派生类的析构函数,便不能释放派生类可能分配的动态内存。
纯手打 如有错 请指教!