【问题标题】:Why is my virtual function "unique" nor working? [closed]为什么我的虚拟功能“唯一”不起作用? [关闭]
【发布时间】:2019-11-04 16:41:54
【问题描述】:

我的基类中有两个虚函数,但其​​中一个不工作。我不知道它有什么问题。有人会帮我吗?

我尝试将虚拟方法“唯一”更改为纯虚拟方法,它会引发错误,提示“未定义纯虚拟函数”。 “打印”似乎可以正常工作,但“唯一”不起作用。

#include <iostream>
#include "polymor.h"

void print (std::vector<Base *> b)
{
    for (int i = 0; i < b.size(); ++i)
    {
      b[i]->print();
      b[i]->unique();
    }
}

int main()
{
  std::vector< Base * > pointers;
  Base * b1 = new Derived1();
  Base * b2 = new Derived2();
  pointers.push_back(b1);
  pointers.push_back(b2);
  print (pointers);
  return 0;
}

//polymor.h:

#ifndef POLYMOR_H
#define POLYMOR_H

#include <iostream>
class Base
{
public:
  virtual void print()
  {
    std::cout << "Base\n";
  }
  virtual void unique()
  {
    std::cout << "BaseUnique\n";
  };
};

class Derived1: public Base
{
public:
  void print()
  {
    std::cout << "Derived1\n";
  }
  void unqiue()
  {
    std::cout << "Der1Unique\n";
  }
};

class Derived2: public Base
{
  void unqiue()
  {
    std::cout << "Der2Unique\n";
  }
};
#endif```

This is my output:

Derived1
BaseUnique
Base
BaseUnique

【问题讨论】:

标签: c++ inheritance overriding virtual


【解决方案1】:

您的派生类中有错字 - 请注意“唯一”拼写错误。

快速诊断此类问题的好方法:使用override 修饰符标记所有应该被覆盖的成员函数。那样的话,如果你犯了这样的错字,编译器会将其标记为错误,而不是导致奇怪的运行时问题。例如,这不会编译:

void unqiue() override // Nothing named "unqiue" to override 
{
  std::cout << "Der1Unique\n";
}

【讨论】:

  • 非常感谢。它就像一个魅力。 :)
  • 您真的必须回答错字问题吗?
  • @SergeyA 在这种情况下,我认为真正的问题不是错字,而是函数上缺少override。我希望提供此详细信息既能立即解决问题,又能在未来提供指导。
  • 我为这个简单的错误道歉,但我了解了覆盖。将来肯定会对我有所帮助。
  • 别担心!事实上,override 被添加到语言中的原因之一是因为此特定错误 (1) 常见,(2) 难以诊断,以及 (3) 导致非常不寻常的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
相关资源
最近更新 更多