c ++

时间:2016-10-02 21:59:16

标签: c++ virtual-functions

我试图理解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; 
}

2 个答案:

答案 0 :(得分:1)

来自cppreference

  

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

由于您在课程show()中取代BpA->show()会在课程show()中致电B。祝希望这有帮助

答案 1 :(得分:1)

通过覆盖虚函数和指针实现多态性: 在你的例子中,你使用pA多态,所以它是一个指向基类(A)的指针,但是你给它分配了一个B类的对象,它是A的子对象。 并且您将Show()声明为虚拟。

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

int main() 
{ 

   int choice;
   cout << "1: A object   2: B object:\n\n";
   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;
}