c++virtual大家来看看吧

问题都写在图片上了我想了一晚上看了很多文章还是没想明白,我眼睛都睁不开可是我还是没想明白,求大佬们了救救我吧

img

img

img

img

  • ****求评价一下我的个人理解,谢谢了╭(°A°`)╮

你的理解是不对的。首先,你的void o()函数是不是漏掉了virtual关键字?如果没有virtual,那就是普通函数,只有virtual才会是虚函数(derived class中的同名函数会自动继承virtual,无需声明该关键字)。
其次,你用到的都是对象,而非指针,对象施行的是静态绑定,而非动态绑定。也就是说,当将子类对象赋值给父类对象的时候,会发生截断,从而只保留父类那一部分。例如,

a po;
abc pi = po;
pi.o();

相当于,

a po; // 构造class a对象
abc temp = (abc)po; // 截断po,只保留base class abc那一部分
abc pi = temp; // 拷贝构造abc对象pi

你用base class对象调用函数,当然调用的是base class的函数了。

记住:动态行为只有在利用指针或引用的时候,才会体系出来,利用对象本身体系的是静态行为。

你只是忘记了重要的东西。选择性遗忘是现代年轻人的通病——只幻想天马行空
里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。
里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现。
LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,
基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为