美文网首页
虚函数纯虚函数测试

虚函数纯虚函数测试

作者: 赛非斯 | 来源:发表于2022-05-27 09:35 被阅读0次
  • 通过编译的方式看看虚函数和纯虚函数的区别
    首先创建一个类
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;
}

相关文章

网友评论

      本文标题:虚函数纯虚函数测试

      本文链接:https://www.haomeiwen.com/subject/wermprtx.html