为什么我的虚拟功能“唯一”或不起作用?

you*_*125 2 c++ virtual inheritance overriding

我的基类中有两个虚函数,但是其中一个不起作用。我不知道这是怎么回事。谁能帮我吗?

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

#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

Run Code Online (Sandbox Code Playgroud)

tem*_*def 8

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

快速诊断此类问题的好方法:用override修饰符标记所有应重写的成员函数。这样,如果您这样打错,编译器会将其标记为错误,而不是导致奇怪的运行时问题。例如,它将不会编译:

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

  • @SergeyA在这种情况下,我认为真正的问题不是拼写错误,而是函数上缺少“ override”。我希望提供此详细信息将立即解决该问题并在将来提供指导。 (2认同)