三个名字上很相近的概念,重载,覆盖,重写,
这里主要是验证一下覆盖,子类的方法覆盖父类的,分别是加和不加virtual。
class Base {
public:
Base() {}
<strong><span style="color:#ff0000;">void getData() const</span></strong> {
cout << "Base getData" << endl;
}
private:
int data;
};
class Sub : public Base {
public:
Sub() {}
<span style="color:#ff0000;">void getData() const</span> {
cout << "Sub getData" << endl;
}
};
在下面代码执行
Base* pointer = new Sub();
pointer->getData();
结果是
Base getData
而如果是
class Base {
public:
Base() {}
<span style="color:#ff0000;">virtual void getData() const </span>{
cout << "Base getData" << endl;
}
private:
int data;
};
class Sub : public Base {
public:
Sub() {}
void getData() const {
cout << "Sub getData" << endl;
}
};
则结果是
Sub getData
也就是说,不加virtual的话,对象会从申明的对象中执行相应的方法,而如果加了virtual,则会执行实际指向的对象的方法。
原因,可以从虚函数表的角度考虑/