源码
// 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. 构造函数会是虚函数吗?析构函数会是虚函数吗?
构造函数不能为虚函数,而析构函数可以且常常是虚函数。