混淆是指针和虚函数的内存分配
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++ 程序,编译器没有足够的信息来执行此优化。
我阅读了有关虚函数的内容,但我无法弄清楚这个概念。 在下面提到的 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++ 程序,编译器没有足够的信息来执行此优化。