重点关注下面函数中内容!
void Test() void func(A* ap)
例子:
class A {
public:
A() {
cout << "A()-----" << endl;
this->p = new char[64];
memset(this->p, 0, sizeof(this->p));
strcpy_s(this->p,strlen("A string-----")+1 ,"A string-----");
}
virtual void print() {//虚函数
cout << "A:" << this->p << endl;
}
~A() {
cout << "~A()---------" << endl;
}
private:
char* p;
};
class B :public A {
public:
B() {
cout << "B()-----" << endl;
this->p = new char[64];
memset(this->p, 0, sizeof(this->p));
strcpy_s(this->p, strlen("B string-----") + 1, "B string-----");
}
~B() {
cout << "~B()---------" << endl;
}
virtual void print() {
cout << "B:" << this->p << endl;
}
private:
char* p;
};
void func(A* ap)//父指针指向子类
{
ap->print();
delete ap;//释放内存空间
}
void Test() {
A* a = new A;
func(a);
}
int main() {
Test();
}
结果:调用class A中的析构函数,这里没有问题。
下面修改函数:
void Test() {
B* b = new B;
func(b);
}
结果:这里出现问题了!调用的还是class A的析构函数,但是应该调用class B的析构函数!
因此,引出虚析构函数,产生多肽。
注意下面各自定义,都是添加virtual。
虚函数:https://blog.csdn.net/weixin_44190648/article/details/122111016
虚继承:https://blog.csdn.net/weixin_44190648/article/details/122108830
在父类的析构函数前添加virtual。
class A {
public:
A() {
cout << "A()-----" << endl;
this->p = new char[64];
memset(this->p, 0, sizeof(this->p));
strcpy_s(this->p,strlen("A string-----")+1 ,"A string-----");
}
virtual void print() {//虚函数
cout << "A:" << this->p << endl;
}
virtual ~A() {//虚析构函数
cout << "~A()---------" << endl;
}
private:
char* p;
};
运行结果:



