- 通过编译的方式看看虚函数和纯虚函数的区别
首先创建一个类
class lens {
public:
void test1();
virtual void test2();
virtual void test3()=0;
lens();
~lens();
private:
};
派生一个类
class lens2:lens{
public:
void test3() override;
//void test4() override;
lens2();
~lens2();
private:
};
- 实验一:
这样调用 lens *l1 = new lens(); 会报错
抽象类不能被初始化
D:/Work/cxxUtils/main.cpp: In function 'int main()':
D:/Work/cxxUtils/main.cpp:4:25: error: invalid new-expression of abstract class type 'lens'
4 | lens *l1 = new lens();
当我们注释掉virtual void test3()=0;的时候,就好了,说明带纯虚函数的类是抽象类 不能被初始化
- 实验二:
注释掉lens2里的void test3() override;
会报错,提示lens2是抽象类,不能初始化。意味着继承一个抽象类要重写它的纯虚方法,不然还是抽象类
D:/Work/cxxUtils/main.cpp:4:27: error: invalid new-expression of abstract class type 'lens2'
4 | lens2* l2 = new lens2();
- 实验三:
len2添加一个方法
void test4() override; 提示test4不能被重写,因为父类没有,就算给父类加上void test4() 也是一样的报错
说明一个道理只有虚函数和纯虚函数可以被重写,可以被加override关键字。override指示一个标识符可以加可以不加。
D:/Work/cxxUtils/lens.h:22:10: error: 'void lens2::test4()' marked 'override', but does not override
22 | void test4() override;
| ^~~~~
实验四:
用基类指针指向子类实例,然后调用虚方法test2,结果打印-----> lens2::test2
说明虚函数可以实现重载。
lens* l1 = new lens2();
l1->test2();
void lens::test2() {
cout<<"lens::test2"<<endl;
}
void lens2::test2() {
cout<<"lens2::test2"<<endl;
}