用基类指针创建的派生类到底是咋回事

用基类指针创建的派生类到底是怎么回事?
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的。
------解决方案--------------------
引用:
p只是声明为基类类型,但它的存储空间仍然是派生类B的结构,所以这个新建的对象是存在f()和a的。

要么加virtual让f成为虚函数,或者dynamic_cast类型转向子类
------解决方案--------------------
要访问子类的成员,还是要先转化为子类才行。((B*)p)->f(),((B*)p)->a,不过这样就没啥意思了。
------解决方案--------------------
存在。
Edit > Advanced > View White Space

------解决方案--------------------
引用:
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,不小心按了不知道什么出现了这些……

当然还是存在的,只是你的指针类型是A类的,所以认为只能访问A类的成员,就无法访问B类的成员了。
------解决方案--------------------
引用:
谢谢各位热心回答,我懂了
没人知道那些蓝点怎么取消吗?

看7L,LZ看帖不仔细啊。