【问题标题】:Calling subclass' method in inherited virtual function?在继承的虚函数中调用子类的方法?
【发布时间】:2015-03-05 04:03:45
【问题描述】:

我是 C++ 新手,但我的印象是 C++ 中的 virtual 相当于 Java 中的 abstract。 我有以下内容:

//A.h
class A {
public:
    void method();
protected:
    virtual void helper();
}

使用以下cpp:

//A.cpp
#include "A.h"
void A::methodA() {
    //do stuff
    helper();
}

然后是派生类:

//B.h
#include "A.h"
class B: public A{
private:
    void helper2();
}

以及以下派生的cpp:

//B.cpp
#include "B.h"

void B::helper2() {
    //do some stuff
} 

void A::helper() {
    helper2();
}

但是,编译器似乎不喜欢我在超类中定义的虚拟方法中调用派生类中定义的helper2 方法。它给出了错误“错误:'helper2'未在此范围内声明”。这不是我应该如何使用虚拟方法吗?

顺便说一句,我不能使用关键字override

【问题讨论】:

  • 向我们展示您的真实代码。 A:methodA 甚至不是 C++。并告诉我们错误对应于哪一行。
  • virtual != abstract。 Java 中的所有非静态方法默认都是虚拟的。

标签: c++ inheritance


【解决方案1】:

[...] 编译器似乎不喜欢我在超类中定义的虚拟方法中调用派生类中定义的helper2 方法。它给出了错误“错误:'helper2'未在此范围内声明”。

该错误与虚函数无关。您不能从基类调用派生类方法。在派生类中声明的方法在基类中不存在


此外,您认为虚函数与抽象函数相同的假设是不正确的。 They're not the same.

令人困惑的是,在 Java 中,all non-static methods are virtual by default。在 C++ 中,您必须在需要时显式声明它们 virtual


此外,您应该在A.cppA.h 中定义A所有 成员函数,现在您在B.cpp 中定义A::helper

【讨论】:

  • 嗯,那我该如何完成类似于 abstract 的事情呢?在基类中声明函数抽象,并在派生类中定义它们允许您在派生类中调用不在基类中的其他方法?
  • 我明白了!我认为我不能使用覆盖这一事实意味着编译器将无法选择使用哪种方法(超级与派生中的方法),但如果我将虚函数声明设置为相等,情况似乎并非如此到 0 在基地。
猜你喜欢
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 2017-11-04
  • 2020-12-20
  • 2015-06-23
相关资源
最近更新 更多