Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 混淆是指针和虚拟函数的内存分配_C++_Virtual Functions - Fatal编程技术网

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

C++ 混淆是指针和虚拟函数的内存分配,c++,virtual-functions,C++,Virtual Functions,我读过关于虚拟函数的书,但我不清楚这个概念。 在下面提到的例子中,我们首先创建一个基指针并分配基对象,然后调用函数为基类,然后分配派生对象并调用其函数。既然我们已经提到了将分配哪些对象,编译器不知道在编译期间调用哪个对象函数吗?我不明白为什么决策会推迟到运行时。我是不是遗漏了什么 #include <iostream> using std::cout; using std::endl; // Virtual function selection class Base { publi

我读过关于虚拟函数的书,但我不清楚这个概念。 在下面提到的例子中,我们首先创建一个基指针并分配基对象,然后调用函数为基类,然后分配派生对象并调用其函数。既然我们已经提到了将分配哪些对象,编译器不知道在编译期间调用哪个对象函数吗?我不明白为什么决策会推迟到运行时。我是不是遗漏了什么

#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()
}
#包括
使用std::cout;
使用std::endl;
//虚拟函数选择
阶级基础
{
公众:
虚空打印()常量
{ 

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

int n;
std::cin >> n;

Base b;
Derived d;

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

这里,根据用户输入进行选择。编译器无法知道
pb
将指向什么。

在您的特定情况下,编译器可能会找出基类指针指向的对象的类型。但是虚拟分派机制专为您没有此信息的情况而设计在编译时初始化。例如

int n;
std::cin >> n;

Base b;
Derived d;

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

在这里,选择是基于用户输入的。编译器不知道
pb
将指向什么。

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

根据我的理解,编译器将在编译时查看引用类型,并绑定在该类中定义和声明的函数他导出->打印()您必须使打印函数在基类中为虚拟函数,以便编译器将绑定延迟到运行时,并使用派生类中定义的函数。

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

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

由于我们已经提到了将分配哪些对象,编译器不知道在编译过程中调用哪个对象函数吗?我不明白为什么决策会延迟到运行时

在这种非常特殊的人为情况下,编译器可以优化所有多态性,是的

我是不是遗漏了什么

#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()
}
想象现实生活中绝大多数代码不是这么简单的,有无数的C++程序,编译器没有足够的信息来执行这种优化。 由于我们已经提到了将分配哪些对象,编译器不知道在编译过程中调用哪个对象函数吗?我不明白为什么决策会延迟到运行时

在这种非常特殊的人为情况下,编译器可以优化所有多态性,是的

我是不是遗漏了什么

#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()
}


想象现实生活中绝大多数的代码不是这么简单的。有很多C++程序,编译器没有足够的信息来执行这个优化。

为什么所有的空行都是一个混乱的代码。做了一些编辑。希望现在好了。我不知道你的编辑如何。它在我的版本上有所改进。为什么所有的空行都是乱七八糟的?你的代码是乱七八糟的。做了更多的编辑。希望现在一切都好。我不知道你的编辑在我的版本上有什么改进。我想知道的是,万一编译器在决定调用哪个函数时有问题吗?因为我已经分配了对象引用所以当它开始编译时应该知道这一点,对吗?就像我说的,它只查看引用类型,即Base pb。因此它不关心编译时分配给引用的对象类型。您通过将基类函数标记为virtual,迫使它在运行时考虑到这一点。所以现在它实际上将检查引用的对象类型并执行派生类中定义的函数。我想知道的是,万一编译器在决定调用哪个函数时出现问题?因为我已经分配了对象引用,所以它在开始编译时应该知道这一点。就像我说的,它只是查看引用类型,即Base pb。因此,它不关心编译时分配给引用的对象类型。通过将基类函数标记为virtual,您正在强制它在运行时考虑这一点。因此,现在它将实际检查引用的对象类型,并执行派生类.Cou中定义的函数你能不能在你的真实生活编码中提到一个有用的场景。这会帮助我了解更多。@Vinay:这是一个荒谬的广泛问题。随着你职业生涯的发展,你会有机地遇到它们。你能不能在你的真实生活编码中提到一个有用的场景。这会帮助我了解更多。@Vinay:这是一个问题这是一个非常宽泛的问题。随着你职业生涯的发展,你会有机地遇到它们。谢谢你。所以在这个特定场景中,虚拟是没有必要的吗?@Vinay在你的例子中,这是没有必要的。为了更好地理解,你还可以提到其他真实的项目场景吗?谢谢你。所以在这篇文章中