试题来源: 解析 答案:虚函数采用一种虚调用的办法。虚调用是一种可以在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数。但是如果要创建一个对象,你势必要知道对象的准确类型,因此构造函数不能为 virtual。反馈 收藏 ...
虚表布局(virtual table layout),结构体和栈帧padding等都会导致不同编译器生成的目标文件不兼容。
我认为也不是。在执行构造函数user code的时候,其实基类和派生类的vftable都已经初始化完成,但此时,基...
如果析构函数不加virtual,delete pb只会执行Base的析构函数,而不是真正的Derived析构函数。 因为不是virtual函数,所以调用的函数依赖于指向静态类型,即Base 二. 纯虚析构函数 现在的问题是,我们想把Base做出抽象类,不能直接构造对象,需要在其中定义一个纯虚函数。如果其中没有其他合适的函数,可以把析构函数定义为...
virtual~Base()=0 }; 可是,这段代码不能通过编译,通常是link错误,不能找到~Base()的引用(gcc的错误报告)。这是因为,析构函数、构造函数和其他内部函数不一样,在调用时,编译器需要产生一个调用链。也就是,Derived的析构函数里面隐含调用了Base的析构函数。而刚才的代码中,缺少~Base()的函数体,当然会出现错...
如果析构函数不加virtual,delete pb只会执行Base的析构函数,而不是真正的Derived析构函数。 因为不是virtual函数,所以调用的函数依赖于指向静态类型,即Base 二.纯虚析构函数 现在的问题是,我们想把Base做出抽象类,不能直接构造对象,需要在其中定义一个纯虚函数。如果其中没有其他合适的函数,可以把析构函数定义为纯...
如果析构函数不加virtual,delete pb只会执行Base的析构函数,而不是真正的Derived析构函数。 因为不是virtual函数,所以调用的函数依赖于指向静态类型,即Base 二.纯虚析构函数 现在的问题是,我们想把Base做出抽象类,不能直接构造对象,需要在其中定义一个纯虚函数。如果其中没有其他合适的函数,可以把析构函数定义为纯...
virtual~Base()=0 }; 可是,这段代码不能通过编译,通常是link错误,不能找到~Base()的引用(gcc的错误报告)。这是因为,析构函数、构造函数和其他内部函数不一样,在调用时,编译器需要产生一个调用链。也就是,Derived的析构函数里面隐含调用了Base的析构函数。而刚才的代码中,缺少~Base()的函数体,当然会出现错...