用基类指针创建的派生类到底是咋回事
用基类指针创建的派生类到底是怎么回事?
class A{};
class B:public A{
public:
void f();
int a;
}
int main()
{
A * p=new B();
}
用p无法访问B类的数据和成员函数,那么这个新建的对象存不存在f()和a?

还有,我用的是VS Express for Desktop,不小心按了不知道什么出现了这些蓝点和方框,怎么取消??
------解决方案--------------------
而派生类中的方法及其属性,父类不一定有的,你用父类去访问子类的数据(父类中没有的),肯定是无法访问到的
------解决方案--------------------
p只是声明为基类类型,但它的存储空间仍然是派生类B的结构,所以这个新建的对象是存在f()和a的。
------解决方案--------------------
要么加virtual让f成为虚函数,或者dynamic_cast类型转向子类
------解决方案--------------------
要访问子类的成员,还是要先转化为子类才行。((B*)p)->f(),((B*)p)->a,不过这样就没啥意思了。
------解决方案--------------------
存在。
Edit > Advanced > View White Space
------解决方案--------------------
当然还是存在的,只是你的指针类型是A类的,所以认为只能访问A类的成员,就无法访问B类的成员了。
------解决方案--------------------
看7L,LZ看帖不仔细啊。
class A{};
class B:public A{
public:
void f();
int a;
}
int main()
{
A * p=new B();
}
用p无法访问B类的数据和成员函数,那么这个新建的对象存不存在f()和a?
还有,我用的是VS Express for Desktop,不小心按了不知道什么出现了这些蓝点和方框,怎么取消??
------解决方案--------------------
而派生类中的方法及其属性,父类不一定有的,你用父类去访问子类的数据(父类中没有的),肯定是无法访问到的
------解决方案--------------------
p只是声明为基类类型,但它的存储空间仍然是派生类B的结构,所以这个新建的对象是存在f()和a的。
------解决方案--------------------
要么加virtual让f成为虚函数,或者dynamic_cast类型转向子类
------解决方案--------------------
要访问子类的成员,还是要先转化为子类才行。((B*)p)->f(),((B*)p)->a,不过这样就没啥意思了。
------解决方案--------------------
存在。
Edit > Advanced > View White Space
------解决方案--------------------
当然还是存在的,只是你的指针类型是A类的,所以认为只能访问A类的成员,就无法访问B类的成员了。
------解决方案--------------------
看7L,LZ看帖不仔细啊。