首页 > 解决方案 > 为什么我的虚拟功能“独特”也不工作?

问题描述

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

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

#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++inheritanceoverridingvirtual

解决方案


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

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

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

推荐阅读