C++继承,如何在基类的方法中调用子类的方法?
C++ inherit, how to call subclass's method in baseclass's method?
我想用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
正文(同样,可以留空(。
您不能调用最初未定义的函数。
相关文章:
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将子类方法声明为基类的友元
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- C ++类型特征:确保子类实现方法
- 函数从唯一代码调用正确的子类方法
- Arduino在子类中使用父类方法
- C++强制在子类中实现方法,但具有不同的签名
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 如何调用传递给 JNI 'jobject' 的 Java 对象的子类/子类的方法
- 将方法参数类型更改为子类中的派生类
- 如果指针的子类的方法对于子类是唯一的,如何访问这些方法?
- C++继承,如何在基类的方法中调用子类的方法?
- 在子类上调用模板化静态方法时获取类的类型名
- 检查子类是否执行了方法重写
- 将"this"从父类方法转换为子类方法是一种好的做法吗?
- 从C++中的父类实例访问子类方法
- 基类中的虚拟方法和子类中的非 Virtula 方法.仍然如何调用子类方法,即使它是非虚拟的
- C ,基础课程如何将子类作为成员包含并调用其方法