Bjarne Stroustrup的C ++编程语言第四版中的以下含义是什么?
"考虑一下。 (点)怀疑应用于所谓的东西 运行时多态,除非它明显应用于a 。参考"
答案 0 :(得分:0)
说你有
struct Base
{
virtual void print() { std::cout << "In Base::print()\n"; }
};
strut Derived : Base
{
virtual void print() { std::cout << "In Derived::print()\n"; }
};
现在您可以将它们用作:
void test(Base base)
{
base.print();
}
int main()
{
Derived d;
test(d);
}
当你这样使用它时,你的程序会遇到对象切片问题。 base
中的test
不会保留有关Derived
的任何信息。它被切成了Base
。因此,您将获得的输出将对应于Base::print()
的输出。
如果您使用:
void test(Base& base)
{
base.print();
}
int main()
{
Derived d;
test(d);
}
程序不会受到对象切片问题的影响。它以多态方式工作,输出将对应Derived::print()
的输出。
警告说明对应于base.print()
的第一版中使用test
。它在对象上使用. (dot)
运算符,该对象是多态类型,而不是引用。