错误:没有''成员函数在类中声明''

时间:2014-01-21 13:36:04

标签: c++ class inheritance virtual

我正在尝试创建一个包含虚函数的类,我想在两个子类中继承它。

我知道有些人已经问过这个问题(例如herethere),但我无法理解答案。

所以我做了一个我正在尝试的简化示例代码:

//Mother .h file 

#ifndef _MOTHER_H_
#define _MOTHER_H_
#include <iostream>

class Mother
{
 protected :
   std::string _name;
 public:
   Mother(std::string name);
   ~Mother();
   virtual std::string getName() = 0; 
};

#endif

//Mother .cpp file

#include "Mother.h"

Mother::Mother(std::string name)
{
  this->_name = name; 
}

Mother::~Mother()
{
}


//Child.h file

#ifndef _CHILD_H_
#define _CHILD_H_
#include "Mother.h"

class Child : public Mother
{
 private : 
   std::string _name;
 public:
   Child(std::string name);
   ~Child();
};

#endif


//Child .cpp file

#include "Mother.h"
#include "Child.h"

Child::Child(std::string name) : Mother(name)
{
  this->_name = name;
}

Child::~Child()
{
}

std::string Mother::getName()
{
  return this->_name;
}

这是我的main.cpp文件:

//Main.cpp file
#include "Child.h"

int main()
{
   Child l("lol");

   std::cout << l.getName() << std::endl;

   Mother& f = l;

   std::cout << f.getName() << std::endl;

   return 0;
 }

以下是编译器的说法: (用g ++编译.cpp -W -Wall -Wextra -Werror)

main.cpp: In function ‘int main()’:
main.cpp:5:9: error: cannot declare variable ‘l’ to be of abstract type‘Child’
In file included from main.cpp:1:0:
Child.h:8:7: note:   because the following virtual functions are pure within ‘Child’:
In file included from Child.h:6:0,
             from main.cpp:1:
Mother.h:14:23: note:   virtual std::string Mother::getName()

我做错了什么?

(对不起,如果我犯了一些英语错误,我不是母语人士)。

3 个答案:

答案 0 :(得分:5)

Mother的声明中,您有:

virtual std::string getName() = 0; 

这不仅仅是virtual,而是 virtualvirtual virtual之间的区别在于,纯种必须在派生类中实现覆盖,即使您有在基类中提供了一个实现。例如:

class Foo
{
public:
  virtual void DoIt() = 0 {};  // pure virtual.  Must be overridden in the derived class even though there is an implementation here
};

class Bar : public Foo
{
public:
  void DoIt(); // override of base
};

void Bar::DoIt()
{
  // implementation of override
}

您无法使用未实现的纯virtual方法实例化类。如果您尝试,将收到编译器错误:

int main()
{
  Foo f;  // ERROR
  Bar b;  // OK
}

这正是你想要做的。您声明getName() virtual Mother,但您未在Child中覆盖它。然后您尝试实例化Child

int main()
{
   Child l("lol");

导致编译错误。

要解决此问题,请在getName()类中提供Child覆盖。

答案 1 :(得分:3)

class child应覆盖getName()方法,因为pure virtual class

中定义的mother

似乎错误给我了...... std::string Mother::getName()中定义了child.cpp

std::string Child::getName()
{
  return this->_name;
}

答案 2 :(得分:0)

基类中的纯虚函数从OOP角度来看,母语是没有意义的,它是所有孩子的共同特征,因此可以使用相同的函数。没有必要覆盖它。

struct Person
{
  Person(std::string name) : _name(name) {}
  std::string _name;
  std::string getName() {return _name; }
};

struct Mother : Human
{
   Mother(std::string name) : Person(name) {}
};

struct Child : Human
{
   Child(std::string name) : Person(name) {}
};