考虑一下(点)当应用于应该是运行时多态的东西

时间:2018-02-20 06:20:16

标签: c++

Bjarne Stroustrup的C ++编程语言第四版中的以下含义是什么?

  

"考虑一下。 (点)怀疑应用于所谓的东西   运行时多态,除非它明显应用于a   。参考"

1 个答案:

答案 0 :(得分:0)

这与object slicing in C++

有关

说你有

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)运算符,该对象是多态类型,而不是引用。