关于c++的覆盖与复写,写了个测试程序,以明确一些概念。发此博客以记录。
1.c++中的多态只是发生在指针或者引用上,对象赋值不存在多态。(见例子中的funcRecoverAssignTest())
2.对象赋值亦会赋值基类变量。(同样见funcRecoverAssignTest())
3.当不声明成员函数为多态时(virtual关键字),子类签名相同的成员函数形成覆盖。此时基类指针不会去查虚表,调用的是基类的成员函数(见funcRecoverTest())
4.引用表现于指针基本一样。
综上推断c++类与对象模型:
1.c++类模型在编译时确定,运行时在堆上分配的是存放成员变量的空间。
2.当声明成员函数为多态时,对象会生成一个虚表,保存多态的成员函数列表。当指针调用时,会查找对象自带的虚表,找到正确的多态函数。
3.如果成员函数不声明为多态,则分配对象时,不会将其列入多态成员函数的虚表,侧当调用函数时,调用的为原对象的成员函数,从而不会形成多态。
代码:
#include
using namespace std;
class Base
{
public:
Base(int i = 1):m_iTag(i)
{
}
virtual void VPrint()
{
cout<<"from base calss virtual print:"<VPrint();
paBase->NPrint();
paBase->PrintTag();
cout<
This is recover point test:
from Super calss virtual print:
This is the Super class
from base calss Nonmal print:
This is the Super class
from super print tag:
the tag is 2
the super tag is 3
This is recover assign test:
from base calss virtual print:
This is the base class
from base calss Nonmal print:
This is the base class
the tag is 2
This is ref test:
from Super calss virtual print:
This is the Super class
from base calss Nonmal print:
This is the Super class
from super print tag:
the tag is 2
the super tag is 3
请按任意键继续. . .