基类和派生类的关系
基类和派生类不是2个独立的类型,派生类是一个基类的类型,它们2个不是分开的,当我们创建一个派生类的时候,派生类中的数据member应该如下
BaseClass : [Base Data] DerivedClass : [Base Data][Derived Data]
派生类的数据类型附加于基类之后
当我们给一个基类类型指向派生类的时候,这个基类指针访问的是派生类继承基类的那部分数据,就算我们在派生类中重新更改继承而来的基类类型,基类指针访问的还是原来的数值,如下
#includeusing namespace std; class Base{ public: int Base_value1 = 1; int Base_value2 = 2; }; class Derived : public Base{ public: int Derived_value1 = 3; int Derived_value2 = 4; int Base_value1 = 10; }; int main() { Base* b = new Derived; cout<< b->Base_value1 << "n"; return 0; }
我们的输出结果如下为1,说明访问的还是base的变量
1
假如我们想做到这个Base 指针访问Derive特有的成员而不是访问从自己身上继承而来的,这个时候虚函数就派上用场了!!!我们在Base中定义一个纯虚函数,然后Derive继承他,并且重载他,因为纯虚函数本来就被Derive继承,本来存于Derive继承Base的member区域中,Derive这个区域中的虚函数是一个虚表指针,虚表指针直接指向这个obj的虚表,这个虚表里面才是具体执行函数的地址,并且Derive进行了override,所以Derive继承而来的虚函数最终指向的是这个Derive override后的函数,如下
#includeusing namespace std; class Base{ public: virtual void print() = 0; //纯虚函数 }; class Derived : public Base{ public: void print() override; }; void Derived::print(){ cout << "Derived_Print!" << "n"; } int main() { Base* b = new Derived; b->print(); return 0; }



