C++我能正确理解多态性吗
C++ Do I Understand Polymorphism Correctly?
Bar和Box是Foo的派生类,Foo有一个虚拟函数F((,Bar和Box都有函数F(((。据我所知,多态性正确地允许Bar.F((而不是Box.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();
您将得到一个很好的编译器错误,因为Box
无法转换为Bar
。:(
所以只有Foo<->Bar
和Foo<->Box
,而不是Bar<->Box
。接下来,当boxxy
是Box
指针时,它将只调用Box::F
函数(如果提供的话(
最后,为了强制子类实现某个函数,您将其声明为pure virtual
,如下所示:
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的方法。长方体指针不能指向Bar对象,因为Bar不是从长方体派生的。
如果派生类没有F((的重写?
它将从基类继承F((的实现。
最后,为了避免实施函数,但仍然允许多态性,你只是写吗空函数体并声明它事实上的
它会起作用,但这不是实现多态性的正确方法。如果你不能为基类的虚拟函数找到一个具体的实现,那么就不要把它实现为空函数。
如果您像这个一样声明Foo
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((。
如果你像这个一样申报Foo
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((的重写?它将使用基类定义
- 最后,为了避免实施函数,但仍然允许多态性,你只是写吗一个空函数体并声明它事实上的你也可以声明它是纯净的虚拟:CCD_ 14。任何打算实例化的类到一个对象中,可以覆盖这个函数并赋予它适当的执行
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 正确执行运算符重载和多态性
- 在容器中正确使用多态性?
- 如何正确组织继承类以利用多态性
- 在c++中使用多态性和继承来处理一篮子水果的正确方法是什么?
- 静态多态性——在c++中这是一个正确的多态场景吗?
- 如何使用具有循环依赖性的组件模式正确地使用多态性
- 当自动满足多态性和虚函数时,正确的行为是什么?
- C++我能正确理解多态性吗