由类初始化和声明指针引起的文章

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值