问题描述
错误在下一行
d_ptr->print(5);
#include<iostream>
using std::cout;
class B {
public:
virtual void print() {
cout << "B::print()\n";
}
virtual void print(int i) {
cout << "B::print(int)\n";
}
};
class D: public B {
public:
void print() {
cout << "D::print()\n";
}
};
int main() {
D d,*d_ptr = &d;
B *b_ptr = &d;
b_ptr->print(5);
d_ptr->print(5);
return 0;
}
如果我注释掉生成错误的行,则代码按预期工作。
所以我的问题是为什么 b_ptr->print(5);
可以正常工作而没有编译错误,但 d_ptr->print(5);
会导致编译错误?
如果 B::print(int)
是非虚函数,那么它是有道理的。因为在那种情况下B::print(int)
会隐藏在D::print()
后面。
但是对于虚函数,调度发生在运行时基于为对象的类创建的虚函数表。那么为什么当我们使用 print()
而不是 d_ptr
调用 b_ptr
时它的行为会有所不同。
如果有人能给我指出正确的资源来消除我的困惑,我将不胜感激。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)