【2022/12/20】virtual多态学习

本文探讨了C++中的虚函数和多态性概念。通过实例展示了`virtual`关键字如何允许通过基类指针调用派生类的成员函数,以及`override`关键字的作用在于确保正确覆盖基类的虚函数。不使用`virtual`时,函数调用将静态绑定到基类,导致无法实现预期的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

virtual多态学习

使用virtual

class test2 {
public:
	test2() { cout << "调用test2构造函数" << endl; }
	virtual void override2() { cout << "test2" << endl; }
	virtual ~test2() { cout << "调用test2析构函数" << endl; }
};

class test3 : public test2 {
public:
	test3() { cout << "调用test3构造函数" << endl; }
	void override2() override { cout << "test3" << endl; }
	~test3() override { cout << "调用test3析构函数" << endl; }
};

执行:

test3 *t3 = new test3();
test2 *t2 = t3;
t2->override2();
t3->override2();
delete t3;

结果:

调用test2构造函数
调用test3构造函数
test3
test3
调用test3析构函数
调用test2析构函数

使用virtual使得对象可以使用指针所指向的对象的函数。因为不使用virtual,那么就会直接静态绑定test2,使用virtual,虚函数表指针才会发生转变,从而指向正确的函数表。同时,指针操作不会构造出任何新的东西出来,引用也一样。写override是为了检查是否声明virtual,如果只写了override没写virtual会报错。

如果不使用virtual

class test2 {
public:
	// test2(test1 t1) :t(t1) {};
	test2() { cout << "调用test2构造函数" << endl; }
	void override2() { cout << "test2" << endl; }
	~test2() { cout << "调用test2析构函数" << endl; }
	
};

class test3 : public test2 {
public:
	test3() { cout << "调用test3构造函数" << endl; }
	void override2() { cout << "test3" << endl; }
	~test3() { cout << "调用test3析构函数" << endl; }
};

执行:

test3 *t3 = new test3();
test2 *t2 = t3;
t2->override2();
t3->override2();
delete t3;

结果:

调用test2构造函数
调用test3构造函数
test2
test3
调用test3析构函数
调用test2析构函数

因为早期就直接静态绑定在t2身上了,就没t3什么事了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值