基类和派生类的关系 基类和派生类不是2个独立的类型,派生类是一个基类的类型,它们2个不是分开的,当我们创建一个派生类的时候,派生类中的数据member应该如下
BaseClass : [Base Data]
DerivedClass : [Base Data][Derived Data]
派生类的数据类型附加于基类之后 当我们给一个基类类型指向派生类的时候,这个基类指针访问的是派生类继承基类的那部分数据,就算我们在派生类中重新更改继承而来的基类类型,基类指针访问的还是原来的数值,如下
#include <iostream>
using 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后的函数,如下
#include <iostream>
using 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;
}
|