混淆是指针和虚函数的内存分配

Confusion is memory allocation for pointers and virtual functions

我阅读了有关虚函数的内容,但我无法弄清楚这个概念。 在下面提到的 example.We 正在创建一个基指针并首先分配基对象,调用函数是基 class 然后分配派生对象并调用其函数。既然我们已经提到将分配哪些对象,编译器是否知道在编译期间调用哪个对象函数?我不明白为什么决定要推迟到 运行 时间。我在这里遗漏了什么吗?

#include <iostream>
using std::cout;
using std::endl;

// Virtual function selection
class Base
{
public:
   virtual void print() const
   { 
      cout << "Inside Base" << endl; 
   }
};

class Derived : public Base
{
public:
   // virtual as well
   void print() const
   { 
      cout << "Inside Derived" << endl; 
   }
};

int main()
{
   Base b;
   Derived f;

   Base* pb = &b;  // points at a Base object
   pb->print();    // call Base::print()

   pb = &f;        // points at Derived object
   pb->print();    // call Derived::print()
}

在您的特定情况下,编译器可能会找出基 class 指针指向的对象的类型。但是虚拟调度机制是为你在编译时没有这些信息的情况而设计的。例如,

int n;
std::cin >> n;

Base b;
Derived d;

Base* pb = n == 42 ? &b : &d;

此处,选择是根据用户输入做出的。编译器无法知道 pb 将指向什么。

根据我的理解,编译器只会在编译时查看引用类型并绑定在class中定义和声明的函数。由于 Derived -> print() 应该被调用,因此您必须在基 class 中使打印函数成为虚拟函数,以便编译器将绑定延迟到 运行 时间并使用派生中定义的函数class.

由于它是虚拟的,它能够动态绑定 函数到正确的对象。这意味着调用函数的指针将调用引用对象的函数。

Since we have already mentioned which objects will be assigned does not compiler know which object function to call during compilation? I did not get why the decision will be delayed till run time.

在这种非常具体、人为设计的情况下,您的编译器可以优化所有多态性,是的。

Am i missing something here.?

想象一下,现实生活中绝大部分代码没有这么简单。有无限多的 C++ 程序,编译器没有足够的信息来执行此优化。