首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于基类和派生类转换的有关问题

2012-03-06 
关于基类和派生类转换的问题!C/C++ codeclass a{public:a();a(char *s){strcpy(name,s)}void getname(){c

关于基类和派生类转换的问题!

C/C++ code
class a{  public:  a();  a(char *s)  {strcpy(name,s);}  void getname()  {cout<<name<<endl;}  private:  char name[10];}class b:public a{public:  b(char *s)  {strcpy(name,s);} void getname() {cout<<"b:"<<name<<endl;}  private:  char name[10];}void main(){  a aa("namea");  a* pa;  b bb("nameb");  pa=&bb;  (a)bb.getname();  pa->getname();  (b*pa)->getname();}
请问 
  1:输出的结果是? 
  2:(a)bb.getname();这样的意思是要输出在派生类b中继承a的getname吧? 那么bb的地址是不是还是指向b的?
  3:pa=&bb;pa的地址已经指向bb了 为什么在调用bb函数的时候还要转换一下呢?
  4:(b)aa.getname();这句话是不是是错的?

谢谢!!!
 

[解决办法]
bb的基类部分没初始化
[解决办法]
C/C++ code
 
#include <iostream>
#include <vector>

using namespace std;

class a
{
public:
  a();
  a(char *s)
  {
    strcpy(name,s);
  }
  void getname()
  {
    cout < <name < <endl;
  }
private:
  char name[10];
};
class b :public a
{
public:
  b(char *s) : a(s)//此处用a(s) 而并不是a(*s) , 并且这样是拷贝基类部分的name
  {
    strcpy(name, s);//此处是赋值派生类的name 这样做的话基类和派生类的name内容一样
  }
  void getname()
  {
    cout < <"b:" < <name < <endl;
  }
private:
  char name[10];
};
int main()
{
  a aa("namea");
  a* pa;
  b bb("nameb");
  pa = &bb;
  ((a)bb).getname();//bb被强制转为a类型的对象 注意符号优先级
  pa->getname();//因为getname不是虚函数 所以是静态调用a::getname;
  ((b*) pa)->getname();//此处不安全 并注意符号优先级
  system("pause");
  return 0;
}


[解决办法]
探讨
system("pause");

[解决办法]
首先,LZ的代码有一点错误!
虽然pa=&bb;,但是它还是会调用a的函数,所以要转换一下。。

热点排行