malloc与new在使用虚函数实现多态上的问题
1.构建三个类
class base {
private:
int i;
public:
base(){};
base(int num) :i(num) {};
virtual void fun1() {
cout << "base::fun1" << endl;
}
virtual void fun2() {
cout << "base::fun2" << endl;
}
void fun3() {
cout << "base::fun3" << endl;
}
};
class derived : public base {
private:
int j;
public:
derived() {};
derived(int num) :j(num) {};
virtual void fun2() {
cout << "derived::fun2" << endl;
}
void fun3() {
cout << "derived::fun3" << endl;
}
};
使用malloc的问题
int main()
{
base *b = (base *)malloc(sizeof(base));
derived *d = (derived *)malloc(sizeof(derived));
base *b_ptr = b;
base *d_ptr = d;
//b_ptr->fun1();//不可执行
//d_ptr->fun1();//不可执行
//b_ptr->fun2();//不可执行
//d_ptr->fun2();//不可执行
b_ptr->fun3();//输出:base::fun3
d_ptr->fun3();//输出:base::fun3
//b->fun1();//不可执行
//d->fun1();//不可执行
//b->fun2();//不可执行
//d->fun2();//不可执行
b->fun3();//输出:base::fun3
d->fun3();//输出:derived::fun3
/*fun1和fun2是虚函数,fun3 不是虚函数*/
free b,d;
return 0;
}
使用new
int main()
{
base *b = new base;
derived *d = new derived;
base *b_ptr = b;
base *d_ptr = d;
//b_ptr->fun1();//输出:base::fun1
//d_ptr->fun1();//输出:base::fun1
//b_ptr->fun2();//输出:base::fun2
//d_ptr->fun2();//输出:derived::fun2
b_ptr->fun3();//输出:base::fun3
d_ptr->fun3();//输出:base::fun3
//b->fun1();//输出:base::fun1
//d->fun1();//输出:base::fun1
//b->fun2();//输出:base::fun2
//d->fun2();//输出:derived::fun2
b->fun3();//输出:base::fun3
d->fun3();//输出:derived::fun3
delete b, d;
return 0;
}
原因
malloc在申请内存空间时,不会调用构造函数,new会调用构造函数;
调不调用构造函数所产生的一个问题就是用于指向虚列表的虚指针没有初始化;
使用malloc的解决方案
显示调用构造函数
int main()
{
base *b = (base *)malloc(sizeof(base));
derived *d = (derived *)malloc(sizeof(derived));
/*显示调用构造函数*/
b->base::base();
d->derived::derived();
base *b_ptr = b;
base *d_ptr = d;
b_ptr->fun1();
d_ptr->fun1();
b_ptr->fun2();
d_ptr->fun2();
b_ptr->fun3();
d_ptr->fun3();
b->fun1();
d->fun1();
b->fun2();
d->fun2();
b->fun3();
d->fun3();
b->base::~base();
d->derived::~derived();
free(b);
free(d);
return 0;
}