我试图在脑海中描绘出它,但老实说,我不知道这里到底发生了什么。
当我在下面的示例中添加和删除虚拟关键字时,到底发生了什么?
#include <iostream>
#include <string>
class A {
public:
A() { me = "From A"; }
void caller() { func(); }
virtual void func() { std::cout << me << std::endl; } // THIS LINE!
private:
std::string me;
};
class B : public A {
public:
B() { me = "From B"; }
void func() { std::cout << me << std::endl; }
private:
std::string me;
};
int main() {
A a;
a.caller();
B b;
b.caller();
return 0;
}
使用 virtual 关键字,它打印“From A”,然后是“From B”。
如果没有 virtual 关键字,它会打印“From A”,然后是“From A”。
到目前为止,这是我唯一一次发现不涉及指针的虚函数的用途。我认为如果删除 virtual 关键字,编译器会做标准的事情,即重载继承的函数并最终打印“From A”和“From B”。
我认为这不仅仅是 VTable 更深入,而且更多的是关于它在特定情况下的行为方式。 B 有 VTable 吗?
最佳答案
电话
func()
相当于
this->func()
所以涉及到一个指针。
不过,无需涉及指针即可理解该行为。
甚至直接调用例如b.func()
必须像 一样工作,这是一个虚拟调用,而 func
在静态已知类型中是虚拟的。编译器可以根据了解 b
的最派生类型对其进行优化。但这是另一种考虑(优化几乎可以做任何事情)。
关于c++ - 从继承函数中调用虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25700841/