C++为什么不能将基类对象地址隐式转换为派生类指针(派生类指针指向基类对象)
派生类继承于基类,因此,派生类的成员变量和成员函数除了继承自其基类以外,可能还有自己独有的成员变量和成员函数。因此,若使用派生类指针指向基类对象:1.当利用派生类指针访问基类对象的成员变量时,派生类指针是把基类对象当作派生类对象来访问的,这样必然出现内存越界访问的问题。2.当使用派生类指针调用派生类独有而基类中不存在的成员函数时,若该成员函数访问了派生类独有而基类没有的成员变量,将出现运行时错误,以为该函数根本无法访问到这个不存在的成员变量。
#include<iostream>
#include<string>
using namespace std;
class Base {
public:
string sb = "我是Base类中的成员变量sb";
virtual void print()const
{
cout << "Base::print()const" << endl;
}
};
class Derived: public Base{
public:
string sd = "我是Derived类中的成员变量sd";
void print()const
{
cout << "Derived::print()const" << endl;
}
string getSd()const
{
return sd;
}
void display()const
{
cout << "Derived中独有的函数\n";
}
};
int main()
{
Base b1;
Derived* pd = (Derived*)&b1;
cout << pd->Base::sb << endl; //能访问到存在的成员变量。
//b1对象不存在成员变量sd,从b1基地址访问sd所在地址将导致内存访问越界。
//cout << pd->sd << endl;
//getSd函数访问了基类对象b1中不存在的成员变量sd,调用失败。
//cout << pd->getSd() << endl;
//该函数没有访问b1中不存在的成员变量,因此调用成功了。
pd->display();
return 0;
}