class Vehicle
{
public:
virtual void run() const=0;
};
int main()
{
Vehicle v1; (1)
Vehicle *v2; (2)
}
编译的话,(1)会报错:’Vehicle’ : cannot instantiate abstract class
(2)不会报错。
解释:
第一种抽象类不能实例化。
第二种只是声明一个指针,可以。
引申:
1、是否可以声明一个类的对象,关键在于该类的对象模型是否是确定的,虚基类显然是不确定的。
至于指针,32位下是4字节,64位也是4字节的(指针的长度指的是数据字长,而不是地址字长。指针最终归结到地址。),这是确定的。
2、编译器为一个对象实例化,必须知道这个对象需要占用多大的空间,每个成员的变量值是多少,当然如果没有构造函数就用随机的或者编译器内部约定的一种构造方式。但是对于这种抽象类,编译器无法确定纯虚函数它的地址到底在哪里。一个类的成员函数地址找不到,自然是不能构造出对象的。
3、对于有虚函数的类,在每个对象空间中用一个vptr指向vtbl