如果两个基派生类中的方法相同。这不是虚拟的,如果我们使用基本指针调用总是调用基本方法?

时间:2018-12-08 18:57:17

标签: c++

假设我有两个c ++类。

#include <iostream>

class base
{
   public:
   void show()
   {
      std::cout<<"In base show";
   }

};

class derived
{
   public:
   void show()
   {
     std::cout<<"In derived show";
   }
};
int main()
{
   base *bptr = new derived();
   bptr->show();
}

为什么总是将其称为show show.base指向派生对象的指针?

1 个答案:

答案 0 :(得分:0)

main.cpp: In function ‘int main()’:
main.cpp:23:29: error: cannot convert ‘derived*’ to ‘base*’ in initialization
    base *bptr = new derived();

这是您应该遇到的编译器错误。您的课程derived实际上不是派生的。您需要从base继承。

class derived : public base {
    // your implementation
}

然后,您的代码将被编译,但是当您运行它时,它仍将显示来自基类的消息。如评论中所述,必须将可以通过继承类覆盖的方法声明为virtual,这指示编译器生成vtable,以便可以在运行时调用正确的方法。

class base
{
   public:
   virtual void show()
   {
      std::cout<<"In base show";
   }

};

将派生类中的方法标记为override也是一种很好的样式。在非虚拟方法上使用重写将导致编译器错误,即您错过的关键字。让编译器告诉您您的错误,这就是它的工作。

class derived : public base
{
   public:
   void show() override
   {
     std::cout<<"In derived show";
   }
};