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

一个关于多重继承中将指向子类的基类指针强转为子类的有关问题

2014-01-22 
一个关于多重继承中将指向子类的基类指针强转为子类的问题class Base1{public:int aBase1(){a 1}}cla

一个关于多重继承中将指向子类的基类指针强转为子类的问题


class Base1
{
public:
int a;

Base1()
{
a = 1;
}
};

class Base2
{
public:
int b;

Base2()
{
b = 2;
}
};

class Derived : public Base1 , public Base2
{
public:
int c;

Derived()
{
c = 3;
}
};

Base2 *pBase2 = new Derived;
Derived *pDerived2 = (Derived*)pBase2;

cout << (void*)pBase2 << endl;
cout << (void*)pDerived2 << endl;


在GCC 和 VC中,执行以上代码后,发现两个地址不一样,并且pDerived2“正确”的指向了Derived类的对象。

多重继承中,一直以为只有将子类地址赋给第一个基类之后的基类指针时才会进行调整,今天却发现,反着也会进行。

查了下《深入探索C++对象模型》并没有见到相应的描述,而《C++ Primer》上也只见说用dynamic_cast,后来想在标准里找找,但感觉有点大海捞针。

请问高手们,这是编译器自己的扩展,还是标准要求的??



[解决办法]
这是很显然的事情,有什么问题么.

--> Derived的指针, 同时也是从Base1继承过来的数据区

[解决办法]
................................................
[解决办法]

--> 从Base2继承过来的数据区

[解决办法]
................................................
[解决办法]

--> Derived自己定义的数据区

[解决办法]
................................................
[解决办法]


多重继承时,除了第一个基类,子类和其他基类间相互进行指针转换,指针都会发生变化。
[解决办法]
如果哦我没记错的话,在你程序的上下文中那个操作的法定名称是static_cast. 查一查有关static_cast的材料,会有对这类转换的详细介绍

那种继承至C的cast可以做太多的事和太多你本来没想做的事,C++区分了static_cast, reinterpret_cast,const_cast和dynamic_cast, 有助于编译器帮你检查你宣称要做的事是不是合法的,尽可能在编译期发现错误(调试和改正的成本较低), 并(supposedly)增加C++程序的可读性。

热点排行