私有继承和虚拟功能

用户名

即使调用不是通过指针或引用进行的,也可以有人帮助我了解虚拟函数的工作原理吗?

#include <iostream>

class Base {
public:
  virtual void f() { std::cout << "Base::f()" << std::endl; }
  void g() { f(); }
};
class Derived : private Base {
  public:
  void f() { std::cout << "Derived::f()" << std::endl; }
  void h() { g(); }
};

int main(){
Derived d;
d.h(); // prints Derived::f() but if virtual keyword is removed from Base::f() then prints Base::f()
}
雷米·勒博

d.h()不会通过指针或引用进行调用,是的。

但是对f() IS的调用是通过指针-隐式this指针进行的。

Base::f()是,virtual并且被覆盖Derived::f(),因此在引用对象一部分f()通过Base*指针(或Base&引用)进行的任何调用都将以多态方式分派到Derived::f()BaseDerived

  • Derived::h()呼唤g(),这是真的this->g(),哪里this是一个Derived*指针。g()对象继承Base并可以在Derived对象上调用g()不是virtual,因此Base::g()被静态调用,其this指向对象Base部分Derived
  • Base::g()呼唤f(),这是真的this->f(),哪里this是一个Base*指针。f()virtual,因此执行多态调度,并且由于this指向对象(该对象Base一部分)的Derived指针Derived::f()被调用而不是Base::f()

如果您删除virtualBase::f(),然后调用f()上的Base*指针(或Base&引用)将静态调用Base::f()无条件,不存在多态分派执行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C ++中,公共继承基类调用派生类的私有虚拟功能

来自分类Dev

继承和私有变量

来自分类Dev

如何使用私有继承的方法重写纯虚拟方法?

来自分类Dev

如何使用私有继承的方法重写纯虚拟方法?

来自分类Dev

私有继承和隐式转换

来自分类Dev

友谊和私有嵌套类的继承

来自分类Dev

Java中的继承和私有变量

来自分类Dev

多重继承/虚拟功能

来自分类Dev

虚拟继承模糊功能

来自分类Dev

具有虚拟功能的C ++中的多重继承

来自分类Dev

继承的私有函数

来自分类Dev

私有变量继承

来自分类Dev

私有属性被继承

来自分类Dev

继承的私有函数

来自分类Dev

const和虚拟继承

来自分类Dev

clang / g ++与私有继承和使用声明的区别

来自分类常见问题

Python中私有和受保护方法的继承

来自分类Dev

多个级别的私有和公共继承-异常访问

来自分类Dev

多个级别的私有和公共继承-异常访问

来自分类Dev

继承中的此运算符和私有变量

来自分类Dev

Java继承私有和公共秩序

来自分类Dev

涉及继承和私有对象的特定问题,C++

来自分类Dev

继承层次中的虚拟功能

来自分类Dev

用不同的返回类型覆盖虚拟函数会引发私有继承错误

来自分类Dev

容器类和带有继承的调用虚拟方法

来自分类Dev

如何禁止公共继承但允许私有(和受保护)继承

来自分类Dev

C ++私有类继承

来自分类Dev

关于多重继承和虚拟继承

来自分类Dev

C ++多重和虚拟继承