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

时间:2014-01-20 23:07:29

标签: c++ inheritance

为什么apple对象种子数据成员输出差异?

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

  2. B线内部如何工作?水果指针指向苹果的植物功能,然后该功能如何决定调用哪种种子?

  3. 在C行,苹果对象指针是否会静态转换为水果指针?

    #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; 
    
    }
    
  4. 输出:

    fruit
    apple
    12
    15
    fruit
    apple
    15
    

1 个答案:

答案 0 :(得分:4)

这是一个非常有趣的问题。问题是,方法函数具有多态性,但成员变量没有。因此,在apple对象中,有两个seed个变量,fruit::seedapple::seed中的函数apple所遮蔽。但是,当您使用指针类型apple访问类型为fruit的对象时,您正在访问fruit的{​​{1}}部分,因此appleseed。请参阅以下代码:

fruit::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;
}