c++中虚函数的概念

concept of virtual functions in c++

本文关键字:函数 c++      更新时间:2023-10-16

我试图理解c++中虚拟函数的概念,我在网上阅读它,但我无法理解为什么下面的程序输出是2而不是1?有人能解释一下吗?

Class A 
{ 
   int a; 
   public: 
       A() 
       {
          a = 1; 
       } 
       virtual void show() 
       { 
          cout <<a;
       } 
};
Class B: public A 
{ 
   int b; 
   public: 
       B() 
       { 
          b = 2; 
       }
       virtual void show() 
       { 
          cout <<b;
       }
};
int main() 
{ 
   A *pA; 
   B oB; 
   pA = &oB; 
   pA->show(); 
   return 0; 
}

通过重写虚函数和指针实现多态性:在你的例子中,你使用多态的pA,所以它是一个指向基类(a)的指针,但你,但你分配给它一个类B的对象,这是a的孩子。你把Show()声明为虚函数

这是多态性的主要目标;这意味着直到运行时我们才知道基指针指向的对象类型,例如在main:

int main() 
{ 
   int choice;
   cout << "1: A object   2: B object:nn";
   cin >> choice;
   if(1 == choice)
       pA = new A; // result will be 1
   else
       if(2 == choice)
           pA = new B; // result will be 2
    if(pA)
        pA->show();
    delete pA;
    pA = NULL;
//  B* pB = new A; // error: cannot convert from class A* to class B* because C++ is not contravariant 
    B* pB = new B;
    pB->show(); // result: 2
    delete pB;
    pB = NULL;
    return 0;
}

From cppreference

虚函数是成员函数,其行为可以在派生类中被重写。与非虚函数相反,即使没有关于类的实际类型的编译时信息,也会保留被重写的行为。如果使用指向基类的指针或引用处理派生类,则调用被重写的虚函数将调用派生类中定义的行为。如果使用限定名查找选择函数(即,如果函数的名称出现在作用域解析操作符的右侧::),则抑制此行为

由于您在B类中重写show(), pA->show()将在B类中调用show()
希望这有助于