理解结构c ++中的多态性

时间:2017-02-02 15:54:46

标签: c++ inheritance

简介

我们有两个结构BaseDeriv。 Deriv继承自Base结构。在以下代码中我们有:

Deriv *dp = new Deriv;
Base *bp = (Base*)dp;

Base指针和Deriv指针都保持相同的地址。该计划的输出是:

  

A 10

现在假设我们在派生类中评论Base inherit;输出将成为:

  

A 20

我不明白为什么我们必须在派生类中添加Base inherit;才能使多态运行。

源代码

#include <iostream>

using namespace std;

struct Base{
    int A;
    char name[5];
};

struct Deriv {
    Base inherit;
    int B;

};

int main()
{
    Deriv *dp = new Deriv;
    Base *bp = (Base*)dp;

    bp->A = 10;
    dp->B = 20;

    cout <<"A" << ((Base *)dp)->A << endl;
    return 0;
}

1 个答案:

答案 0 :(得分:1)

这可能是实现继承的C方法,这很好,但是如果你使用的是C ++,除非你真的知道你在做什么,否则我认为没有意义。

修改
Deriv基本上构造为

struct Deriv
{
    int A;
    char name[5];

    int B;
};

即使Base指针指向此结构,事情仍然正常。

但如果删除Base inheritDeriv现在只是

struct Deriv
{
    int B;
};

现在当Base指针ptr指向此结构时,ptr->A将是B的字段Deriv,而ptr->name将{{1}}超出范围并可能导致未定义的行为。