关于基类和派生类转换的有关问题
关于基类和派生类转换的问题!
1:输出的结果是?
2:(a)bb.getname();这样的意思是要输出在派生类b中继承a的getname吧? 那么bb的地址是不是还是指向b的?
3:pa=&bb;pa的地址已经指向bb了 为什么在调用bb函数的时候还要转换一下呢?
4:(b)aa.getname();这句话是不是是错的?
谢谢!!!
------解决方案--------------------
bb的基类部分没初始化
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
首先,LZ的代码有一点错误!
虽然pa=&bb;,但是它还是会调用a的函数,所以要转换一下。。
- 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;
}
------解决方案--------------------
------解决方案--------------------
首先,LZ的代码有一点错误!
虽然pa=&bb;,但是它还是会调用a的函数,所以要转换一下。。