malloc与new在使用虚函数实现多态上的问题

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值