class BaseClass{
public:
int a;
char buf[250];
void abcd(){
cout<<"hello base from abcd";
}
virtual void defg(){
cout<<"hellow base from defg";
}
};
class DerivedClass: public BaseClass{
public :
int b;
char bufb[255];
void bcde(){
cout<<"hello base from bcde";
}
virtual void defg(){
cout<<"hellow base from defg";
}
};
int main(){
BaseClass* bas=new BaseClass();
DerivedClass* der;
der=static_cast<DerivedClass*>(bas);
cout<<"address of der ="<<der <<" base= "<<bas<<endl;
der->bcde();
cout<<endl<<"Base size:"<< sizeof(*bas)<<" Derived size:"<<sizeof(*der)<<endl;
getch();
return 0;
}
基类对象的派生类指针如何调用派生类的方法。为什么和如何? 由于在内存中创建的基类对象只是基类的大小,它如何包含派生类方法。它成功地被召唤了。
输出:==&GT;
der的地址= 002585A8 base = 002585A8
你好基地来自bcde
基本尺寸:260衍生尺寸:520
答案 0 :(得分:4)
通过将指针强制转换为DerivedClass*
,当最派生的对象属于BaseClass
类型,然后使用该指针访问DerivedClass
内容时,您有未定义的行为,UB。 UB的一个可能的影响是,错误地认为会发生的事情发生。其他可能性包括崩溃,挂起和奇怪的结果。
实际上,由于DerivedClass::bcde()
不访问实例中的任何数据,并且不调用任何虚函数,唯一可能的崩溃原因是编译器插入的显式检查。
我不知道任何添加此类检查的编译器,但编译器可以自由地执行此操作,并且通常可以自由地假设UB不会发生。
答案 1 :(得分:0)
编译器纯粹基于类型信息绑定非虚方法bcde。由于该方法没有引用对象内容,因此内存布局没有发挥作用。
答案 2 :(得分:0)
输出消息中有错误
class DerivedClass: public BaseClass{
public :
int b;
char bufb[255];
void bcde(){
cout<<"hello base from bcde";
}
virtual void defg(){
cout<<"hellow base from defg";
}
};
DerivedClass应该从bcde&#34;打印&#34; hello der ,而不是&#34; hello base 来自bdce&#34;。实际上,您的代码会打印来自DerivedClass的消息。