为什么apple对象种子数据成员输出差异?
似乎水果指针只指向水果数据成员。我不能在苹果中覆盖这个成员。为什么呢?
B线内部如何工作?水果指针指向苹果的植物功能,然后该功能如何决定调用哪种种子?
在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;
}
输出:
fruit
apple
12
15
fruit
apple
15
答案 0 :(得分:4)
这是一个非常有趣的问题。问题是,方法函数具有多态性,但成员变量没有。因此,在apple
对象中,有两个seed
个变量,fruit::seed
被apple::seed
中的函数apple
所遮蔽。但是,当您使用指针类型apple
访问类型为fruit
的对象时,您正在访问fruit
的{{1}}部分,因此apple
是seed
。请参阅以下代码:
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;
}