非虚重载成员函数
Non-virtual overloaded member functions
此代码
#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
我不明白为什么。
我知道如果我使用虚函数 oneB 会被打印出来,但为什么上面的代码示例中没有。没有使用指针或引用,为什么我需要声明函数虚拟?
No pointers or references are used, why do I need to declare the function virtual?
你错了,这段代码:
int A::devone() {
one();
}
等于:
int A::devone() {
this->one();
}
因此使用了指针,要在运行时解析正确的函数,您必须使用 virtual
函数。
如果您没有将 one
声明为虚拟的,那么它将不会在 A
的 vtable 中有一个条目。如果 A
中没有 vtable 条目,这意味着它唯一知道的 one
是它自己的。因此,当您从 A::devone
调用 one
时,逻辑上它 可以 调用的唯一函数是 A::one
.
它输出 "oneA" 因为你正在调用 A::devone(),后者又调用 A::one()。
因为 A::one() 不是虚拟的,即使你有一个 B 实例,基础 A class one() 方法仍然会被调用。
如果你添加
int devone() {
one();
}
到 B class,将调用 B::one() 方法。
此代码
#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
我不明白为什么。 我知道如果我使用虚函数 oneB 会被打印出来,但为什么上面的代码示例中没有。没有使用指针或引用,为什么我需要声明函数虚拟?
No pointers or references are used, why do I need to declare the function virtual?
你错了,这段代码:
int A::devone() {
one();
}
等于:
int A::devone() {
this->one();
}
因此使用了指针,要在运行时解析正确的函数,您必须使用 virtual
函数。
如果您没有将 one
声明为虚拟的,那么它将不会在 A
的 vtable 中有一个条目。如果 A
中没有 vtable 条目,这意味着它唯一知道的 one
是它自己的。因此,当您从 A::devone
调用 one
时,逻辑上它 可以 调用的唯一函数是 A::one
.
它输出 "oneA" 因为你正在调用 A::devone(),后者又调用 A::one()。
因为 A::one() 不是虚拟的,即使你有一个 B 实例,基础 A class one() 方法仍然会被调用。
如果你添加
int devone() {
one();
}
到 B class,将调用 B::one() 方法。