-
(3)通过子类对象初始化父类对象,通过父类对象不能访问子类重名函数(虚): 按照上面的理论,子类对象初始化父类对象后,子类对象的数据成员会覆盖掉父类对象的数据成员,但是这里,父类原有的虚函数表是没有被覆盖掉的,父类对象的虚函数表指针还是自己的表指针;表指针里的虚函数地址还是父类自己的虚函数地址,所以此时通过父类对象只能访问到子类对象的数据成员(继承自父类的),访问自己代码区的成员函数和虚函数列表中的自己的虚函数,不能访问到子类虚函数列表中的虚函数;查看全部
-
当类中没有虚函数的时候: 我们通过类的对象访问其数据成员,访问其成员函数;前面已经知道,实例化对象时,只有数据成员的大小,这说明类的成员函数是统一放在内存代码区的,并且有自己的类名称空间作为限制,只能自己实例化的对象访问;所以我们通过对象访问数据成员,是直接在对象的内存块中偏移得到;而通过对象访问成员函数,则是要到代码区才能访问到; 当父类与子类之间有重名函数时: (1)通过子类对象访问父类该重名函数(于是有了隐藏): 父类与子类有重名函数时,这时出现了隐藏,即子类是继承了父类的该重名函数的,但是将其隐藏了。通过子类对象访问该函数时,访问的是子类自己的该函数,如果想要访问父类的该函数,则要在函数前面加上父类的名称空间限定;代码示例如下:父类Person和子类Worker,都有一个同名函数name();通过子类对象worker调用父类该函数时,worker.Person::name(); (2)通过父类指针指向子类对象,并访问子类重名函数(于是有了虚函数): 父类指针指向子类对象时,父类指针只能访问子类对象的数据成员(部分,继承自父类的),和访问父类在代码区的自己的成员函数;此时,如果想要通过父类指针访问到子类对象的成员函数(即通过父类指针调用子类的析构函数或者普通重名函数),就要将该重名函数设定为虚函数,然后将虚函数地址放进该类的虚函数表中(于是有了覆盖,即在子类虚函数表中用子类虚函数地址覆盖掉父类虚函数地址),而对象又多了个数据成员(虚函数表指针),且在对象内存块首位;这样当我们用父类指针指向子类对象,且调用子类重名虚函数时,就要先在虚函数表中查找,如果找到,就执行;即调用成员函数时,有虚函数表先在虚函数表中查找,然后再在代码区查找; 这里我只解释了父类指针访问子类重名函数的情况,没有解释虚析构函数不重名也能访问的情况。我想可能是析构函数有自己特殊的用法吧,可能每个类的析构函数都是同一个名字,而在代码中名字是不同的吧。这里如果有同学想明白了,希望能不吝赐教;查看全部
-
try catch可以是一对多的查看全部
-
RTTI必须转换的是引用或指针,并且父类要是纯虚函数 必须包含头文件#include <typeinfo>.否则报错 利用typeid(i).name()查出变量i的类型查看全部
-
type_id的注意事项。查看全部
-
dynamic_cast注意事项。查看全部
-
仅含有纯虚函数的类称为接口类:只有成员函数,没有数据成员,且成员函数都是纯虚函数。查看全部
-
抽象类的子类,只有把所有纯虚函数都坐了具体的实现,这个子类才可以实例化对象。查看全部
-
抽象类不允许实例化对象。查看全部
-
含有纯虚函数的类叫做抽象类。 纯虚函数:没有函数体,在定义的时候函数写明=0,例如 virtual double calcPerimeter() = 0;查看全部
-
虚函数表指针占据的是每个对象的前四个内存单元 有虚函数时,对象中首先存虚函数表指针,再存数据成员地址,没有虚函数时,首先存的是数据成员的地址。 有虚函数时,先使用指针 p 指向对象,访问的虚函数表指针,int* q = (int *)&circle取得的是虚函数表地址,再使 q++ 就指向了数据成员,(unsigned int)(*q)就能取得数据成员的值。查看全部
-
对虚析构函数加入virtual后,sizeof(shape)不再为1,说明实例化的对象中含有一个虚函数表指针查看全部
-
当一个对象里面一个数据成员都没有的时候,是否意味着该对象不占用内存呢,显然不是,如图: shape对象没有数据成员,但是仍占用1个字节(因为对象至少要占用一个字节来声名自己的存在) 而circle中有一个int的成员,所以占了4个字节查看全部
-
当定义父类的一个函数为虚函数时,在子类中重载这个函数,用一个父类指针指向子类对象,并调用该函数的时候,调用的是子类的函数而不是父类的。如果父类中这个函数不是虚函数的话,调用的就是父类的函数了。查看全部
-
#include <typeinfo> if(typeid(*obj).name == "Bus") if(typeid(*obj) == typeid(Tank)) Tank *tank = dynamic_cast<Tank *>(obj); doSomething(&b);查看全部
举报
0/150
提交
取消