[英]Calling derived class methods using array of base class pointers which has pointers to derived class objects
[英]Array of pointers to the base class that contains objects of derived classes and overloaded << operator
我有以下問題。
我已經創建了一個指向基類對象的指針數組,但是我在這個數組中也存儲了派生類中對象的指針。
我還重載了每個類中的<<operator
來顯示對象。 但是,當我將這個重載的<<operator
應用於上面提到的數組時,它會將所有指針視為指向基類的對象。
下面我將介紹描述問題的代碼。 我需要這個重載的運算符才能正常工作,因為我需要將數組指向的對象保存在文件中。
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
class Base
{
public:
int basevar;
Base(): basevar(1) {};
virtual void dosth(){};
friend ostream & operator<<(ostream & screen, const Base & obj);
};
ostream & operator<<(ostream & screen, const Base & obj)
{
screen << obj.basevar;
return screen;
};
class Der1: public Base
{
public:
int de1;
Der1(): de1(2) {};
virtual void dosth()
{
cout << "Der1" << endl;
}
friend ostream & operator<<(ostream & screen, const Der1 & obj);
};
ostream & operator<<(ostream & screen, const Der1 & obj)
{
Base b;
b = static_cast <Base>(obj);
screen << b;
screen << " " << obj.de1;
return screen;
};
class Der2: public Base
{
public:
int de2;
Der2(): de2(3) {};
virtual void dosth()
{
cout << "Der2" << endl;
}
friend ostream & operator<<(ostream & screen, const Der2 & obj);
};
ostream & operator<<(ostream & screen, const Der2 & obj)
{
Base b;
b = static_cast <Base>(obj);
screen << b;
screen << " " << obj.de2;
return screen;
}
int main()
{
Base * array[] = {new Base(), new Der1(), new Der2()};
for(int i=0; i<3; ++i)
{
cout << *array[i]; // <- always displays objects as if they were from the base class
}
return 0;
}
您可以通過以下方式在基類中聲明虛函數
class Base
{
public:
int basevar;
Base(): basevar(1) {};
virtual std::ostream & out( std::ostream &os ) const
{
return os << basevar;
}
virtual void dosth(){};
friend ostream & operator<<(ostream & screen, const Base & obj);
};
在這種情況下,操作員將看起來像
ostream & operator<<(ostream & screen, const Base & obj)
{
return obj.out( screen );
};
並在派生類中重新定義虛函數。 例如
class Der1: public Base
{
public:
int de1;
Der1(): de1(2) {};
std::ostream & out( std::ostream &os ) const
{
return Base::out( os ) << " " << obj.de1;
}
virtual void dosth()
{
cout << "Der1" << endl;
}
};
在這種情況下,不需要為派生類定義運算符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.