派生类指针到基类对象如何调用派生类的方法?

时间:2014-09-27 05:42:55

标签: c++ derived-class

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

3 个答案:

答案 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的消息。