继承存储派生的地址

时间:2014-03-25 21:31:05

标签: c++ oop

我只是想了解下面的这段代码,但无法理解这两行代码 在末尾。

ptr = &D;
ptr->show(); 

我实际上正在研究多态性概念。这只是基础知识。所以请解释一下它是如何工作的以及为什么ptr-> show()在base中调用函数。

#include <iostream>
using namespace std;

class Base {
    public:
        void show() 
        {
            cout << "This is the base\n";
        }
};

class Derived : public Base {
    public:
        void show() 
        {
                cout << "This is the derived\n";
        }
};


int main() 
{
   Base B;
   B.show(); 
   Derived D;
   D.show();

   Base *ptr = &B;
   ptr->show(); 

   ptr = &D;
  ptr->show(); 

   return 0;
}

输出

这是基础

这是派生的

这是基础

这是基础

2 个答案:

答案 0 :(得分:1)

根据指针的静态类型调用成员函数。如果在这种情况下将函数show定义为virtual,则在由于使用vptr进行间接调用而由派生类的地址分配的ptr时调用它。

当你声明ptr为Base *ptr时,它的静态类型是Base,那么编译器调用成员函数show在类Base中定义。

答案 1 :(得分:0)

Base是一个简单的类。

Derived是一个继承自Base的类。 (我们会说Derived是Base的女儿,Base是Derived的母亲)

让我们看看遗产的影响:

  • 母亲的所有方法都可以在女儿身上找到
  • 如果在两个类(母亲和女儿)中定义了一个方法,则将使用第一个方法。如果关键字virtual应用于方法,则执行。
  • 您可以使用Mother类指针操作子类

B是Base的实例

Base B;

类Base的调用方法show

B.show();

D是Derived的实例

Derived D;

类Derived的调用方法show

   D.show();

创建一个指向Base类的指针,该类初始化为B对象的地址(基类)

  Base *ptr = &B;

Class Base的调用方法show,导致ptr是Base指针

   ptr->show(); 

使用D对象(派生类)的地址初始化ptr指针

   ptr = &D;

Class Base的调用方法show,导致ptr是Base指针

  ptr->show(); 

为什么这样工作?他为什么不打电话给Derived show方法?

想象一下编译器算法......

你告诉他:&#34;请拨打方法秀!对于ptr&#34;

指出的课程

因此它会查看ptr(Class Base)指向的值的类型并查看方法show。函数show是否具有关键字virtual?

  • 没有?所以我现在就叫它!

  • 是?所以我要经历所有的女儿并采取最后的节目定义,然后打电话给它!

你明白了吗?

如果您有任何疑问,请与您好友!