虚函数不是免费的,在我们类中插入一个普通函数不占用空间,但是虚函数本质上是加了一个虚函数表指针(4B)
当类中的虚函数>=1时,编译器就会为类生产一个虚函数表(virtual table)
多态性:父类有虚函数,子类有一个同名函数,当父类指针new一个子类对象或者通过父类引用来绑定一个子类对象时,如果用父类指针来调用这个虚函数,那么其实调用的是子类的虚函数
调用虚函数不一定是多态,多态又必然和虚函数扯上关系;
class dad {
public:
virtual string print() {
return "dad";
}
};
class son :public dad {
private:
string name;
public:
son(string name_s) :name(name_s) { };
string print() override { //最好在这里加上override增加代码可读性(C++11)
return name;
}
};
void print_name(dad*d)
{
cout << d->print() << endl;
}
int main()
{
//多态性
dad* x=new son();
son y;
dad* z=&y;
dad* d = new dad();
son* s = new son("son");
print_name(d);
print_name(s);
return 0;
}
//打印结果都是dad,想dad和son各打印各的,并且二者保持联系,就在dad(基类)对应函数前+virtual
//这就是虚函数引入的地方,虚函数引入一个叫动态联编的东西,通过V表(虚函数表)来实现编译,包含基类所有虚函数的映射,这样可以在运行时把它们映射到正确的覆写函数(override)
纯虚函数:在基类中定义一个没有实现的函数,然后强制在子类中实现该函数;不能实例化基类对象,new子类