gpt4 book ai didi

c++ - 基类和派生类之间的继承数据成员c++

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:11 24 4
gpt4 key购买 nike

为什么苹果对象种子数据成员输出不同?

  1. fruit 指针似乎只指向 fruit 数据成员。我不能在苹果中覆盖这个成员。为什么?

  2. B 线内部如何运作? fruit 指针指向 apple 的 plant 函数,然后这个函数如何决定调用哪个种子?

  3. 在 C 行,apple 对象指针是否静态转换为 fruit 指针?

    #include <iostream>
    #include <vector>
    using namespace std;

    class fruit
    {
    public:
    int seed;
    fruit()
    {
    cout <<"fruit" <<endl;
    seed = 12;
    }

    virtual void plant()
    {
    cout << seed <<endl;
    }
    };

    class apple:public fruit
    {
    public:
    int seed;

    apple()
    {
    cout << "apple" << endl;
    seed = 15;
    }
    void plant()
    {
    cout << seed << endl;
    }
    };

    int main()
    {

    vector<fruit*> ft;
    ft.push_back(new apple());// line C

    cout << ft[0]->seed << endl; // line A
    ft[0]->plant();// line B

    apple* ap = new apple();
    cout << ap->seed <<endl;

    }

输出:

fruit
apple
12
15
fruit
apple
15

最佳答案

这是一个非常有趣的问题。问题是,方法函数具有多态性但成员变量没有。所以在 apple 对象中,有两个 seed 变量,fruit::seedapple::seed< 覆盖apple 的函数中。但是,当您使用指针类型 fruit 访问类型为 apple 的对象时,您正在访问 apple< 的 fruit 部分,因此 seedfruit::seed。请看下面的代码:

#include <iostream>
#include <string>

using namespace std;

class A
{
public:
int v;
virtual ~A() {} // ensure A is polymorphic
};

class B: public A
{
public:
int v;
};

int main(void)
{
A* aa = new B;

aa->v=20;
dynamic_cast<B*>(aa)->v=10;

cout<<aa->v<<endl;
cout<<dynamic_cast<B*>(aa)->v<<endl;
}

输出:

20
10

关于c++ - 基类和派生类之间的继承数据成员c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21246004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com