子类将基类的虚函数替换为其自己的虚函数,共用的一个虚函数表,怎么不影响基类

在 C++ 中,编译器会为每个类生成一个虚函数表,其中包含该类所有虚函数的地址。每个类对象都含有一个指向其虚函数表的指针,实际上,这个指针指向的是该类的虚函数表,也就是说,所有该类对象的虚函数指针指向该虚函数表。
在 C++ 继承机制中,派生类会继承基类的所有非私有成员,包括虚函数及其地址。如果派生类对虚函数进行了重新定义,那么它会生成一个新的子类虚函数表,并且把不同的虚函数地址填入其中,从而覆盖了基类虚函数表中对应的虚函数地址。
但实际上,派生类并没有直接改变基类的虚函数表,而是生成自己的一个子类虚函数表,所有的子类对象虚函数指针指向该子类虚函数表。所以,操作派生类对象不会污染基类的虚函数表,它们之间的虚函数是完全独立的。
如果通过基类指针调用虚函数,那么编译器会根据指针所指向的对象的类型来确定它要调用的虚函数的地址,这里涉及到虚函数的动态绑定问题。如果该指针指向一个派生类对象,那么派生类的虚函数地址就会被调用,而如果指向一个基类对象,那么基类的虚函数地址就会被调用,这个过程与实际的虚函数表是如何维护无关。

你可能感兴趣的:(c++,c++)