C++工作笔记-多继承下的一个大坑

当一个类多继承了2个类,如类C,继承了类A和B。创建了很多类C放到list<A*>这种容器中,一个list,保存的是类A的指针。

如果用类A直接转成类B,这个类B是无法得到类C中继承下来的类B的数据。

因为类A和类B没有半毛钱关系。

具体例子如下:

代码如下:

#include <iostream>
#include <list>
using namespace std;

class MyBase{
public:
	int getMyValue(){ return m_myValue; }
	void setMyValue(int myValue){ m_myValue = myValue; }

private:
	int m_myValue;
};

class MyItem{
public:
	void myPrint(){ cout << "MyItem Print Called" << endl; }
};

class MyClass :public MyBase,MyItem{
public:
	void printf(){ cout << "MyValue:" << MyBase::getMyValue() << endl; }
};

void main(){
	MyClass *myClass1 = new MyClass;
	MyClass *myClass2 = new MyClass;
	MyClass *myClass3 = new MyClass;
	myClass1->setMyValue(1);
	myClass2->setMyValue(2);
	myClass3->setMyValue(3);

	list<MyItem *> myList;
	myList.push_back((MyItem *)myClass1);
	myList.push_back((MyItem *)myClass2);
	myList.push_back((MyItem *)myClass3);

	list<MyItem *>::iterator iter;
	for (iter = myList.begin(); iter != myList.end(); iter++){
		cout << "把MyItem转成MyBase:" <<((MyBase*)(*iter))->getMyValue() << endl;

		MyClass *my = ((MyClass*)(*iter));

		/*下断点看看变量*/
		MyBase *a = ((MyBase*)(*iter));
		MyBase *b = ((MyBase*)my);
		/*下断点看看变量*/

		cout << "把MyItem转成MyClass:" <<my->getMyValue() << endl;
		cout << "把MyClass转成MyBase:" <<((MyBase*)my)->getMyValue() << endl;

	}

	getchar();
}

运行截图如下:



下一个断点,看看他们的地址,更加能得到结果:


猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/80379256