c++ - C++虚函数的概念

标签 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; 
}

最佳答案

你通过覆盖虚函数和指针来实现多态性: 在您的示例中,您以多态方式使用了 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;
}

关于c++ - C++虚函数的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39822137/

相关文章:

c++ - 应该使用头文件 ctgmath/tgmath.h 吗?

c++ - Bazel Link .so 库位于一个完全不同的、非常远程的文件夹中

c++ - 我需要通过基类静态变量访问派生类成员

c++ - 虚函数不返回具有多级继承的派生类型

java - 改进 Comparable<T> compareTo 性能

c++ - 在运行时调用处理 constexpr。 C++

c++ - 如何用转义字符替换字符串中的所有特殊字符?

C++继承: calling overloaded base class function

c++ - 使用复制构造函数且存在虚函数时出现错误 "recursive on all control paths"

c++ - 基类有虚方法,子类有非虚方法。即使它是非虚拟的,仍然如何调用子类方法