【问题标题】:Inheritance of a Virtual Function虚函数的继承
【发布时间】:2013-12-18 20:17:43
【问题描述】:

我有以下代码。

class A {
public: 
  virtual void foo() = 0;
}

class B : public A {
public:
  void bar() { /* Do something */ }
}

void B::A::foo() {
   bar();
   // Do something else
}

当我尝试编译它时...我收到一条错误消息,说它找不到bar()。这不是实例化纯虚函数的正确方法吗?

use of undeclared identifier 'bar'

【问题讨论】:

  • A 有一个注入类名(类似于 typedef)成员 A,也就是说,A::A 可以引用 A 本身。此成员在B 中继承。因此,B::A 指的是A。当然,在void A::foo() 的范围内,没有成员bar
  • 您必须将 void foo() 添加到您的 B 类声明中。正如已经提到的一个答案 B::A::foo() 没有意义

标签: c++ inheritance c++11 virtual-functions clang++


【解决方案1】:

void B::A::foo() 没有多大意义。看来您的意思是在B中实现foo(),为此您需要在B的类声明中声明它,然后再实现它:

class B : public A {
public:
  void foo();
  void bar() { /* Do something */ }
};

void B::foo() {
   bar();
   // Do something else
}

【讨论】:

  • 我需要再次制作原型吗?不会显示为两个函数....foo()A::foo()
  • @subzero 是,也不是。 A::foo() 已在 A 中声明。 B::foo()B 中声明,并覆盖前者。
【解决方案2】:

由于以下几个原因,您的代码无法编译:

class A 
{
public: 
  virtual void foo() = 0; // this defining a pure virtual function - making A an abstract class
}; // missing ; here

class B : public A 
{
public:
  void bar() { /* Do something */ }
  // you never implement foo, making B another abstract class
}; // again with the ;

void B::A::foo() // this line makes no sense
{
   bar();
   // Do something else
}

我相信你正在尝试做的是以下

class A 
{
public: 
    virtual void foo() = 0;
};

class B : public A 
{
public:
    virtual void foo() { bar(); } // override A::foo
    void bar() { /* Do something */ }
};

如果你要覆盖一个函数,你必须将它声明为被覆盖。如果你从抽象基类派生一个类并且不实现它的功能,那么你的派生类也是一个抽象基类。在实例化任何类之前,它的所有函数都必须是非抽象的。

【讨论】:

  • 这只是使继承的类 B 的类能够额外覆盖 foo() 方法。应该也是正确的,但其他解决方案已经解决了问题而没有编译错误。很确定,但更正了。
  • @ChristianSchack 我不确定你想说什么。你能更清楚地解释你的意思吗?
  • 在 A 类中定义 virtual void foo() = 0;是纯粹虚拟的,或者换句话说是抽象的。意味着子类必须实现此方法。类 B 中的声明 virtual void foo() 使 Class C : public class B 可以额外覆盖此函数,但不能因为它被声明为只是虚拟的。但是对于这个问题没有必要->继续
  • @ChristianSchack w.r.t 的唯一区别。您的代码是 B::foo() 在此处隐式内联,并且此代码缺少 ;
  • @juanchopanza 是的,你是对的。真的没有问题。我的解决方案意味着一个单独的头文件和实现文件。你在我回答前几分钟完全正确。但这不是我认为的评论问题。为您的回答 +1
猜你喜欢
  • 2013-07-24
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
相关资源
最近更新 更多