2016-10-02 58 views
0

我想了解C++中的虚函数的概念,我在线阅读它,但我无法理解为什么下面的程序输出是2而不是1?谁能解释一下?C++中的虚函数的概念

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; 
} 
+3

你能解释为什么你所期望的结果是“1”? –

+0

你为什么认为输出结果应该是“1”? –

+1

继续阅读你的C++书籍,这完全解释了这个概念。 –

回答

1

你实现多态性与压倒一切的虚函数和指针: 在你的榜样,你用pA的多态所以它是一个指向基类(A),但你,但你给它分配一个B类的对象,是A. 的子代,并且您将Show()声明为虚拟。

这是polymorphis的主要目标;这意味着我们不知道对象的类型基本指针指向直到运行时如主:

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; 
} 
1

cppreference

虚拟函数是成员函数,其行为可以在派生类被重写。与非虚函数相反,即使没有关于类的实际类型的编译时信息,重写的行为也会被保留。 如果使用指针或对基类的引用处理派生类,则调用重写的虚函数将调用派生类中定义的行为。如果使用合格的名称查找选择功能受到抑制这种行为(即,如果函数的名字出现在范围解析操作的正确:因为,你在B类中重写show() :)

pA->show()将在类B中呼叫show()
希望这有助于