没有躲过的坑--抽象类不能实例化对象(但是你明明定义的不是抽象类)
2017-07-23 17:39
344 查看
今天在开发过程中遇到了一个错误:不能实例化抽象类
这个错误完全是自己疏忽大意造成的。
首先我们知道,一个类如果是抽象类,我们就不能用这个类实例化一个对象。
什么样的类是抽象类呢?
C++没有C Sharp中的关键字abstract,但是当一个类中有一个或多个纯虚函数的时候,这个类就自动成为了抽象类,即不可以实例化。
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。
在实际开发中,很多时候你都需要继承别人的类,或是同事写的类,或是一些开源库中的类。
也许是为了追求效率,我们很难认真阅读你要继承的基类,或者说你只关心基类中你需要的几个方法。
这个时候,就存在错误的风险。也许父类中有一个纯虚函数你完全不关系,用不到,你就会大摇大摆的忽略它。
但是它不会忽略你,记住:
如果你的抽象类的派生类有任何一个纯虚函数没有实现,那么不管其他做的再多,这个类仍然是一个抽象类。
所以用到你定义的子类实例化对象时候,会产生上述的错误。
好在编译器能够帮助我们,以至于可以及时改正。
所以,在继承一个类的时候,要确保实现了所有这个基类的纯虚函数。
这个错误完全是自己疏忽大意造成的。
首先我们知道,一个类如果是抽象类,我们就不能用这个类实例化一个对象。
什么样的类是抽象类呢?
C++没有C Sharp中的关键字abstract,但是当一个类中有一个或多个纯虚函数的时候,这个类就自动成为了抽象类,即不可以实例化。
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。
在实际开发中,很多时候你都需要继承别人的类,或是同事写的类,或是一些开源库中的类。
也许是为了追求效率,我们很难认真阅读你要继承的基类,或者说你只关心基类中你需要的几个方法。
这个时候,就存在错误的风险。也许父类中有一个纯虚函数你完全不关系,用不到,你就会大摇大摆的忽略它。
但是它不会忽略你,记住:
如果你的抽象类的派生类有任何一个纯虚函数没有实现,那么不管其他做的再多,这个类仍然是一个抽象类。
所以用到你定义的子类实例化对象时候,会产生上述的错误。
好在编译器能够帮助我们,以至于可以及时改正。
所以,在继承一个类的时候,要确保实现了所有这个基类的纯虚函数。
//基类: classA { public: A(); virtual ~A(); void f1(); virtual void f2(); virtual void f3()=0; }; //子类: classB:publicA { public: B(); virtual ~B(); void f1(); virtual void f2(); virtual void f3(); };
相关文章推荐
- 没有躲过的坑--抽象类不能实例化对象(但是你明明定义的不是抽象类)
- 没有躲过的坑--抽象类不能实例化对象(但是你明明定义的不是抽象类)
- 类不能实例化对象?(定义的也不是抽象类)
- 类实例化对象可以访问静态(static)方法,但是不能访问静态属性。
- 用c++编写一个不能被继承的类(但是可以在类外部定义该类的对象)
- 抽象类不能实例化对象
- 接口和抽象类不能实例化对象
- 抽象类可以没有抽象方法,不能被实例化
- java书写规范问题,for、while、do while{}后面不能直接定义变量或生成对象(在没有大括号的情况下)
- 用c++编写一个不能被继承的类(但是可以在类外部定义该类的对象)
- oracle用Authid Current_User 定义的建表过程plsql可执行别的用户对象,但是job却不能调用
- 【中科大洋笔试题】定义一个不能被继承的类,并且只能实例化3个对象。
- 增删改查不是万能的,但是万万不能没有增删改查——限信息管理类
- 增删改查不是万能的,但是万万不能没有增删改查——限信息管理类
- 抽象类和接口作为形式参数 多态 抽象类和接口虽然都不能直接创建对象,但是可以通过多态进行对象的创建
- 抽象类不能定于对象,但可以用抽象的类定义指针!
- java书写规范问题,for、while、do while{}后面不能直接定义变量或生成对象(在没有大括号的情况下)
- java书写规范问题,for、while、do while{}后面不能直接定义变量或生成对象(在没有大括号的情况下)
- 定义一个交通工具(Vehicle)的类,在测试类Vehicle中的main()中实例化一个交通工具对象,通过方法给它初始化speed,size的值,并打印出来。另外,调用加速,减速的方法对速度进行改变
- “automation服务器不能创建对象” “库没有注册”