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

C++ inherit, how to call subclass's method in baseclass's method?

本文关键字:方法 子类 调用 基类 继承 C++      更新时间:2023-10-16

我想用A::func1(x)调用B::func2(int x, int y),如何声明它们?

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的未定义符号:

"类型信息 for A",引用自:

typeinfo for B in test-bbac7f.o

"vtable for A",引用自:

A::() in test-bbac7f.o

注意:缺少 vtable 通常意味着第一个非内联虚拟成员>函数没有定义。

LD:找不到建筑x86_64符号

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

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

这正是您的情况下将要发生的事情。见科利鲁。

基本上,这就是虚拟通话的意义所在。由于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.
}

附言这个答案建议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.( 通过附加=0;使A::func2成为纯虚拟的,或者使用大括号{}定义其主体(请注意,它可以留空(。

2.( 使用大括号{}定义B::func2正文(同样,可以留空(。

您不能调用最初未定义的函数。