为什么含有纯虚函数的类不能定义对象?
编译器是怎么实现的啊
[解决办法]
就2个字:规定!
[解决办法]
普通类具有成员函数,构造类的对象时,不但要为成员变量分配内存,还要为成员函数分配内存。
含有纯虚函数的类,定义了成员函数的地址是空,无法分配内存,成员函数对类是没有意义的,失去了普通类的数据和方法绑定于同一对象中的意义,因此无法构造对象,只能又其派生类继承这些成员函数并实现,才能构造派生类对象。抽象类就起到了定义接口的作用。
[解决办法]
1、纯虚函数是可以有实现的;并不一定非要只声明,不实现。
2、就算是纯虚函数有了实现,带有纯虚函数的类仍然是抽象类,不可实例化。这是C++标准规定的。
[解决办法]
因为抽象类中包含有没有定义的函数,因此不能用抽象类来实例化对象。
但可以声明抽象类的指针指向派生类。
[解决办法]
这可以从为什么引入抽象类来解释
抽象类表示一个界面,支持一种基于将界面的描述和实现区分开来的设计风格
选择纯虚函数的概念,是想将一个类声明为抽象类的思想明确化,选择性的定义函数
是一种灵活的多的方式(以前虚函数都必须在它们最先声明的类里定义)
以图形基类shape 为例
shape 本身根本不存在,一般其中的虚函数根本不会被调用,却造成了开销
解决方案就是建立一个抽象类,既然其不存在,自然就不应该被实例化
这即是抽象类的语法特性
当然通过将相应虚函数定义为纯虚,只是一种实现方式,也可以通过将构造函数
声明为私有来实现这一约束,只是前者更加直观而已
参考《C++语言的设计与演化》
[解决办法]
至于纯虚函数的实现
virtual void x() = 0;
这句,等于告诉编译器在VTABLE中为函数保留一个间隔,但在这个特定间隔
中不放地址。只要有一个函数在类中被声明为纯虚函数,则VTABLE就是不完全的
这样当某人试图创建这个类时,编译器会由于不能安全的创建一个纯抽象类的对象
而发出一个出错信息,这样编译器就可以保证抽象类的纯洁性,不会被误用
参考《C++编程思想》 14章:多态和虚函数