C++ 16 —— 虚函数

来源:互联网 发布:淘宝一年前的购买记录 编辑:程序博客网 时间:2024/06/15 19:50

源码

// 16Poly_Virtual.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "iostream.h"class Pet{public:    virtual void Speak(){}};class Dog : public Pet{public:    void Speak()    {        cout << "WangWang" << endl;    }};void Feeding(Pet& p){    p.Speak();}//问题1. 什么叫做前绑定(early binding)和后绑定(later binding)?//问题2. virtual会自动继承吗?如果会,子类中还需要写明Speak是virtual吗?//问题3. vtable和vptr是指什么?多态是如何实现的?//问题4. vptr何时初始化?Feeding函数的参数可以传递(Pet p)吗?//问题5. 构造函数会是虚函数吗?析构函数会是虚函数吗?int main(int argc, char* argv[]){    printf("Hello World!\n");    return 0;}

问题1. 什么叫做前绑定(early binding)和后绑定(later binding)?

直接调用函数会导致前绑定。利用函数指针调用函数会导致后绑定。

问题2. virtual会自动继承吗?如果会,子类中还需要写明Speak是virtual吗?

会。不需要。

问题3. vtable和vptr是指什么?多态是如何实现的?

虚表和虚指针。虚表中存放的是所有虚函数的首地址,存放顺序和(继承顺序、函数的声明顺序)有关。每个派生类都有一个虚指针,存放对应虚函数的地址。

问题4. vptr何时初始化?Feeding函数的参数可以传递(Pet p)吗?

编译阶段。不可以

问题5. 构造函数会是虚函数吗?析构函数会是虚函数吗?

构造函数不能为虚函数,而析构函数可以且常常是虚函数。