【发布时间】:2019-08-31 10:42:03
【问题描述】:
我想了解以下涉及虚函数的 C++ 程序的输出背后的原因。还请说明以下两种情况下如何生成函数指针表和包含指向函数指针表的链接的虚拟指针表,以及在运行时如何解析调用。
/******* PROGRAM 1 *******/
#include <iostream>
using namespace std;
class Car {
public:
virtual void foo() {
cout<<"Car"<<endl;
}
};
class Bmw: public Car {
public:
void foo1() {
cout<<"Bmw"<<endl;
}
};
int main() {
Car *c = new Bmw();
c->foo(); // gives output Car even though foo()
//function does not exist in BMS class.
return 0;
}
/******* PROGRAM 2 *******/
#include<iostream>
using namespace std;
class Car {
public:
virtual void foo() {
cout<<"Car"<<endl;
}
};
class Bmw: public Car {
public:
void foo() {
cout<<"Bmw"<<endl;
}
};
class Bmw7: public Bmw {
public:
void foo1(){
cout<<"Bmw7"<<endl;
}
};
int main() {
Car *c = new Bmw7();
c->foo(); //gives output Bmw. Why output is not Car ??
return 0;
}
【问题讨论】:
-
foo1不是foo。您可能会发现override很有帮助 -
您也不妨咨询this list。没有什么比一本经过审查的好书更能帮助人们理解像 C++ 这样的复杂语言了。
-
@user4581301 你为什么不认为这是一个答案?
-
@Yunnosch 在我看来太像错字了。如果不是,那么“标识符必须匹配”对未来的程序员来说没有多大价值。如果您不知道您已经达到 Stack Overflow 的计时器,那么您的参考资料充其量是狡猾的。
-
@user4581301 问题中给出的上述代码 sn-p 中没有错字。我在 Arcesium 的采访中被问到这个问题,但无法做到。我被拒绝了,在那之后我做的第一件事就是在这里发布这个问题。 2年过去了,我目前在Arcesium的母公司D.E.工作。 Shaw,作为 C++ 开发人员 (SDE-II)。接受的答案和所有 cmets 现在对我来说非常有意义。
标签: c++ oop inheritance polymorphism virtual-functions