- 派生类实现基类的虚函数时,基类中虚函数表和派生类的虚函数表地址不同,基类虚函数表中的虚函数地址和派生类虚函数表中的虚函数地址不同;
- 派生类不实现基类的虚函数时,基类中虚函数表和派生类中虚函数表地址不同,基类虚函数表中的虚函数地址和派生类虚函数表中的虚函数地址相同。
- 派生类实现基类的虚函数
#includeclass TESTA { public: TESTA() = default; ~TESTA() = default; virtual void test() { std::cout << "TESTA test()" << std::endl; } }; class TESTB : public TESTA{ public: TESTB() = default; ~TESTB() = default; virtual void test() { std::cout << "TESTB test()" << std::endl; } }; int main() { TESTA a; TESTB b; int **p = (int**)&a; std::cout << "father virtual table address: " << p[0] << std::endl; std::cout << "father virtual func address: 0x" << std::hex << p[0][0] << std::endl; p=(int**)&b; std::cout << "son virtual table address: " << p[0] << std::endl; std::cout << "son virtual func address: 0x" << std::hex << p[0][0] << std::endl; return 0; }
运行结果:
father virtual table address: 0x5577d3b7fd40 father virtual func address: 0xd3b7d532 son virtual table address: 0x5577d3b7fd28 son virtual func address: 0xd3b7d56e
从运行结果可以看到:派生类实现基类的虚函数,基类中虚函数表和派生类的虚函数表地址不同,基类虚函数表中的虚函数地址和派生类虚函数表中的虚函数地址也不同。
- 派生类不实现基类的虚函数
#includeclass TESTA { public: TESTA() = default; ~TESTA() = default; virtual void test() { std::cout << "TESTA test()" << std::endl; } }; class TESTB : public TESTA{ public: TESTB() = default; ~TESTB() = default; void test1() { std::cout << "TESTB test1()" << std::endl; } }; int main() { TESTA a; TESTB b; int **p = (int**)&a; std::cout << "father virtual table address: " << p[0] << std::endl; std::cout << "father virtual func address: 0x" << std::hex << p[0][0] << std::endl; p=(int**)&b; std::cout << "son virtual table address: " << p[0] << std::endl; std::cout << "son virtual func address: 0x" << std::hex << p[0][0] << std::endl; return 0; }
运行结果:
father virtual table address: 0x5582e3f9ad40 father virtual func address: 0xe3f98532 son virtual table address: 0x5582e3f9ad28 son virtual func address: 0xe3f98532
从运行结果可以看到:派生类不实现基类的虚函数,基类中虚函数表和派生类中虚函数表地址不同,基类虚函数表中的虚函数地址和派生类虚函数表中的虚函数地址相同。



