C ++我能正确理解多态吗?

| Bar和Box是Foo的派生类,Foo具有虚拟函数F(),Bar和Box都具有函数F()。据我了解,多态性正确地允许Bar.F()代替Box.F()或Box.F()代替Bar.F()使用某些运行时例程覆盖Foo.F(),而无需知道您的对象是否酒吧或盒子。就像这样:
Foo * boxxy = new Box;
boxxy->F();
最后一行将调用正确的F()(在本例中为Box.F()),而与boxxy是Box还是Bar还是Foo无关(在这种情况下,将调用虚拟Foo.F()的实现) )。 我理解这个权利吗?如果boxxy是Box指针,会发生什么变化?如果派生类没有对F()的覆盖,会发生什么?最后,为避免为基类实现函数但仍允许多态,您是否只是编写一个空函数体并将其声明为虚函数?谢谢。     
已邀请:
几乎正确-考虑以下继承树:
      Foo
     /   \\
   Bar   Box
如果现在创建这样的指针:
Bar* barry = new Box();
您会遇到一个不错的编译器错误,因为无法将compiler3 get转换为
Bar
。 :) 所以只有
Foo<->Bar
Foo<->Box
,而不是
Bar<->Box
。 接下来,当
boxxy
Box
指针时,它将仅调用
Box::F
函数(如果提供)。 最后,要强制子类实现某个功能,请声明为“ 11”,如下所示:
virtual void Func() = 0;
//   note this --- ^^^^
现在,子类(在这种情况下为
Bar
Box
)必须实现
Func
,否则它们将无法编译。     
是的,取决于您通过Foo指针创建的对象的类型,将调用正确的F()。 如果boxxy是Box指针,则只能调用它的F()或它的派生类的F()之一,除非您对其父类进行了dynamic_cast然后调用了F( )。 为了避免必须在基类中实现,可以将其定义为纯虚拟的,如下所示:
class Foo
{
public:
    virtual void F() = 0; //notice the = 0, makes this function pure virtual.

};
    
  如果boxxy是Box,会发生什么变化   指针? 它将允许访问非从Foo继承的Box方法。 Box指针不能指向Bar对象,因为Bar不是从Box派生的。   如果派生类会发生什么   没有对F()的覆盖? 它将从基类继承F()的实现。   最后,为避免实施   对于基类起作用,但仍然   允许多态,你只是写   一个空的函数体并声明它   虚拟? 它将起作用,但这不是进行多态的正确方法。如果您无法为基类的虚函数提供具体的实现,请将该函数设为纯虚函数,则不要将其实现为空函数。     
如果你这样宣布富
class Foo
{
private:
  Foo() {};
public:
  void func() const { std::cout << \"Calling Foo::func()\" << std::endl; }
};
和酒吧这样
class Bar : public Foo
{
private:
  Bar() {};
public:
  void func() const { std::cout << \"Calling Bar::func()\" << std::endl; }
};
然后
Foo* bar = new Bar();
bar->func();
将调用Foo :: func()。 如果你这样宣布富
class Foo
{
private:
  Foo() {};
public:
  virtual void func() const { std::cout << \"Calling Foo::func()\" << std::endl; } // NOTICE THE virtual KEYWORD
};
然后
Foo* bar = new Bar();
bar->func();
将调用Bar :: func()。     
我理解这个权利吗?是的,如果该函数被声明为虚函数。 如果boxxy是Box,会发生什么变化 指针?取决于是否 功能是否是虚拟的。虚拟的 函数将总是结束调用 适当的派生函数;一种 非虚函数将调用 根据版本的类型 指针。 如果派生类会发生什么 没有对F()的覆盖?它 将使用基类定义。 最后,为避免实施 对于基类起作用,但仍然 允许多态,你只是写 一个空的函数体并声明它 虚拟?您也可以将其声明为纯净的 虚拟的:
virtual void F() = 0
。任何 打算实例化的类 变成一个对象,将其覆盖 发挥作用并给它一个适当的 实施。     

要回复问题请先登录注册