我想在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查看调用)
答案 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
定义{}
的正文(再次,可以留空)。
您无法调用未在首位定义的功能。