此代码
#include <iostream>
struct A {
int one() {
std::cout << "oneA" << std::endl;
}
int devone() {
one();
}
};
struct B : A {
int one() {
std::cout << "oneB" << std::endl;
}
};
int main() {
B b;
b.devone();
}
打印 oneA
我不明白为什么。 我知道如果我使用虚拟函数打印一个,但为什么不在上面的代码示例中。没有使用指针或引用,为什么我需要声明虚函数?
答案 0 :(得分:2)
没有使用指针或引用,为什么我需要声明虚函数?
你错了,这段代码:
int A::devone() {
one();
}
等于:
int A::devone() {
this->one();
}
所以使用指针,并且要在运行时解析正确的函数,你必须使用virtual
函数。
答案 1 :(得分:1)
如果您未将one
声明为虚拟,那么它将在A
vtable中没有条目。如果A
中没有vtable条目,则表示它所知道的唯一one
是它自己的。因此,当您从one
致电A::devone
时,逻辑上 可以调用的唯一功能是A::one
。
答案 2 :(得分:0)
它输出“oneA”,因为你正在调用A :: devone(),它又调用A :: one()。
因为A :: one()不是虚拟的,即使你有一个B实例,也会调用基类A类one()方法。
如果你添加
int devone() {
one();
}
到B类,将调用B :: one()方法。