为什么可以';t a';基类对象';称之为';她自己的虚拟功能?C++; 我已经阅读了C++中的虚拟函数,并了解了它们如何使用基类指针为程序员提供派生类成员函数的访问权限。(又名多态性)

为什么可以';t a';基类对象';称之为';她自己的虚拟功能?C++; 我已经阅读了C++中的虚拟函数,并了解了它们如何使用基类指针为程序员提供派生类成员函数的访问权限。(又名多态性),c++,polymorphism,virtual-functions,C++,Polymorphism,Virtual Functions,困扰我的问题有: 如果最终必须声明为虚拟函数,为什么要在基类中声明具有相同名称的函数?(注意:我需要虚拟函数多态性方面的答案) 在下面的代码中,如果使用基类指针(第22行)调用“virtual display()”,则会显示错误。C++中的虚函数为什么不被基类指针调用? #包括 使用名称空间std; B类 { 公众: 无效虚拟显示() {cout我承认我不太理解你的问题#1。在基类中声明虚函数允许派生类重写该实现 有很多用途(只是搜索多态性,Liskov替换等)。作为一个简单的(和设计的)例子

困扰我的问题有:

  • 如果最终必须声明为虚拟函数,为什么要在基类中声明具有相同名称的函数?(注意:我需要虚拟函数多态性方面的答案)
  • 在下面的代码中,如果使用基类指针(第22行)调用“virtual display()”,则会显示错误。C++中的虚函数为什么不被基类指针调用?

    #包括
    使用名称空间std;
    B类
    {
    公众:
    无效虚拟显示()
    
    {cout我承认我不太理解你的问题#1。在基类中声明虚函数允许派生类重写该实现

    有很多用途(只是搜索多态性,Liskov替换等)。作为一个简单的(和设计的)例子,考虑这个:

    struct File
    {
      virtual void open() { some_code; }
      virtual void close() { some_code; }
    
      static std::unique_ptr<File> create();
    };
    
    struct DbgFile : File
    {
      virtual void open() { std::clog << "Opening"; File::open(); }
      virtual void open() { std::clog << "Closing"; File::close(); }
    };
    
    std::unique_ptr<File> File::create()
    {
    #ifdef NDEBUG
      return { new File };
    #else
      return { new DbgFile };
    #endif
    }
    
    int main()
    {
      auto f = File::create();
      f->open();
      f->close();
    }
    

    b
    是一个指针而不是一个对象。最初它没有指向任何东西(因此间接通过它是一个错误);在
    b=&d
    之后,它指向一个
    d
    对象,因此使用它调用虚函数将调用
    d
    的重写

    虚拟分派机制的定义是基于指针指向的实际对象的类型而不是指针的声明类型来选择函数。因此,如果它指向
    B
    对象,那么它将调用
    B::display
    ;这里,它指向
    D
    对象,因此它调用
    D::display

    如果最终必须声明为虚拟函数,为什么要在基类中声明具有相同名称的函数

    它需要在基类中声明,以便在使用指向基类的指针时,编译器知道它存在。通过指针调用函数将调用基类版本,还是由派生类重写的版本,取决于对象的类型

    在下面的代码中,如果使用基类指针(第22行)调用
    virtualdisplay()
    ,则显示错误

    这是因为它没有指向任何东西,所以使用它是一个错误。如果它指向
    B
    对象,那么它将调用
    B
    中声明的函数

    B b_obj;
    b = &b_obj;
    b->display();   // "Inside base class"
    
    为什么C++中的虚函数如此刚性?W.R.T没有被基类指针调用? 它们不是;这是调用它们的通常方式。但是指针必须指向有效对象,虚拟分派才能工作。

    如果最终必须声明为虚拟函数,为什么要在基类中声明具有相同名称的函数?(注:我需要关于虚拟函数多态性方面的答案)

    这是必要的,因为基类必须知道在运行时需要调用哪个函数定义。它是一种接口

    In the code below, if 'virtual display()' is called with a base class pointer (Line 22), it shows an error. Why are virtual functions in C++ so rigid w.r.t. not getting called by base class pointers?
    
    由于指针未初始化,它将抛出一个错误

    Base baseObj1,*basePtr;
    
    basePtr= &baseObj1;
    
    basePtr->Display();  //Inside base class
    

    您可以在调用display之前调用它的基类:
    b->b::display()
    @CollioTV谢谢。它可以工作:)@CollioTV:尽管使用无效指针这样做仍然是非法的(即使在本例中,它可能是意外工作的)。感谢您在一行中解释“虚拟分派机制”。通过您上次的更新,我可以轻松地将虚拟函数与多态性关联起来。Tx。
    In the code below, if 'virtual display()' is called with a base class pointer (Line 22), it shows an error. Why are virtual functions in C++ so rigid w.r.t. not getting called by base class pointers?
    
    Base baseObj1,*basePtr;
    
    basePtr= &baseObj1;
    
    basePtr->Display();  //Inside base class