【发布时间】:2014-10-31 06:58:17
【问题描述】:
我试图在脑海中将其映射出来,但老实说,我不知道这里到底发生了什么。
到底发生了什么当我添加和删除 virtual 关键字时下面的例子?
#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 吗?
【问题讨论】:
-
caller本质上调用this->func,其中this是A*。这会调用动态调度 IFFA::func是虚拟的。 -
@dyp,值得提升为答案。
标签: c++ inheritance polymorphism virtual-functions