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什么事了。