C+中的动态绑定+@ 我是C++的新手,请帮助我,编译器是如何做动态绑定的,即使Cyr1、Case2和Cuff3不使用继承类,如基类和派生类关系->类派生::公共类基类{};

C+中的动态绑定+@ 我是C++的新手,请帮助我,编译器是如何做动态绑定的,即使Cyr1、Case2和Cuff3不使用继承类,如基类和派生类关系->类派生::公共类基类{};,c++,C++,#include <iostream> using namespace std; class Class1{ public: virtual void f(){ cout << "f() in class 1\n"; } void g(){ cout << "g() in class 1\n"; } }; class Class2{ public: virtua

#include <iostream>

using namespace std;

class Class1{
    public:
    virtual void f(){
        cout << "f() in class 1\n";
    }
    void g(){
        cout << "g() in class 1\n";
    }

  };

class Class2{
    public:
    virtual void f(){
        cout << "f() in class 2\n";
   }
   void g(){
        cout << "g() in class 2\n";
   }

};

 class Class3{
 public:
    virtual void f(){
        cout << "f() in class 3\n";
    }

   };

 int main()
  {
       Class1 object1, *p;
       Class2 object2;
       Class3 object3;
       p = &object1;
       p->f();
       p->g();
       p = (Class1 *)&object2;
       p->f();
       p->g();
       p = (Class1 *) &object3;
       p->g();
    return 0;
   }
Output:
f() in class 1
g() in class 1
f() in class 2
g() in class 1
g() in class 1
#包括
使用名称空间std;
一班{
公众:
虚空f(){
cout g();
返回0;
}
输出:
类1中的f()
类1中的g()
类2中的f()
类1中的g()
类1中的g()

未定义的行为。

在完全不相关的类型之间转换并访问它们的内容是未定义的行为,所以任何事情都可能发生,包括看起来像是工作了一样

不要这样做


此外,在该上下文中使用C样式转换类似于重新解释转换。您应该尽可能避免使用该转换。例如,如果使用
静态转换
,则会出现编译器错误。

以下是对此处发生情况的解释: 1.)如果类中至少存在一个虚拟函数,则构造函数将为该类创建一个vtable,并为调用对象创建一个vptr。此vtable仅包含虚拟函数。然后,编译器将在运行时(动态绑定)解析每个多态调用从指针所指的对象类型,而不是指针本身的类型。 因此,这里: 2.)类1将有一个vtable,我们称之为vtable(类1)。然后是vtable(类2)和vtable(类3)。将有4个vptr、vptr(对象1)、vptr(p)、vptr(对象2)和vptr(对象3)。 3.)因此,当在运行时解析调用;p=(类1*)&object 2;p->f();和p->g()时,编译器将查找由p引用的对象的对象vptr,即对象2;虽然它被强制转换,但引用的对象仍然是对象2,因此将调用vptr(对象2),它将在vtable(类2)中搜索虚拟函数f在搜索g()时,vptr不会在vtable中找到它,因此会查找指针本身的类型,即类1,并调用类1的g。
4.)注意:虚拟函数与多态性有关,而不是继承。

明白你的意思,通过使用reinterpret_cast,我们强制编译器强制转换不相关的类型,如果我们尝试使用static_cast,它将导致编译时错误,因为类型不相关。谢谢:)