我只是想了解下面的这段代码,但无法理解这两行代码 在末尾。
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;
}
输出
这是基础
这是派生的
这是基础
这是基础
答案 0 :(得分:1)
根据指针的静态类型调用成员函数。如果在这种情况下将函数show定义为virtual,则在由于使用vptr进行间接调用而由派生类的地址分配的ptr时调用它。
当你声明ptr为Base *ptr
时,它的静态类型是Base,那么编译器调用成员函数show在类Base
中定义。
答案 1 :(得分:0)
Base是一个简单的类。
Derived是一个继承自Base的类。 (我们会说Derived是Base的女儿,Base是Derived的母亲)
让我们看看遗产的影响:
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?
没有?所以我现在就叫它!
是?所以我要经历所有的女儿并采取最后的节目定义,然后打电话给它!
你明白了吗?
如果您有任何疑问,请与您好友!