C ++继承,如何在基类的方法中调用子类的方法?

时间:2017-07-20 10:20:12

标签: c++ oop inheritance

我想在B::func2(int x, int y)中致电A::func1(x),如何申报?

class A {
public:
    void func1(int x);
    virtual void func2(int x, int y); // do not need implement in A
};

class B : public A {
public:
    void func2(int x, int y) override; // override
};

void A::func1(int x) {
    int y;
    func2(x, y); // I want to use the version of A's subclass
}

int main()
{
    B b;
    b.func1(x); // call A::func1(x) first then call B::func2(x, y)
}

它不会编译,而是显示以下错误消息

  

> clang ++ test.cpp -std = c ++ 11

     

架构x86_64的未定义符号:

     

" A"的typeinfo,引自:

 typeinfo for B in test-bbac7f.o
     

" vtable for A",引自:

 A::() in test-bbac7f.o
     

注意:缺少的vtable通常表示第一个非内联虚拟成员>   功能没有定义。

     

ld:找不到架构x86_64的符号

     

clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

2 个答案:

答案 0 :(得分:2)

  

// call A::func1(x) first then call B::func2(x, y)

确切地说,你的情况会发生什么。请参阅at Coliru

基本上,这是虚拟通话的内容。由于func2被标记为"虚拟",当它被调用A::func1时,调用将通过vtable,因此将调用覆盖方法B::func2

反之亦然:如果您希望A::func1调用A::func2,则必须明确写出来:

void A::func1(int x) {
    int y;
    A::func2(x, y); // explicitly tell to use A's version; otherwise the overriden method from the subclass is invoked.
}

P.S。 This answer建议让A::func2纯虚拟。如果您不打算使用A::func2的实施,这可能是有道理的。如果出于某种原因,你需要在A::func2中包含一些功能代码,那么典型的模式是在派生类中添加对A::func2的调用,比如

void B::func2(int x, int y) {
  A::func2(x, y);
  // do something specific for B
}

答案 1 :(得分:1)

一些事情:

1。)通过附加A::func2使=0;纯虚拟,或使用大括号{}定义其主体(注意它可以留空)。

2。)使用大括号B::func2定义{}的正文(再次,可以留空)。

您无法调用未在首位定义的功能。