我有三个分支:
{abstract class}
B继承A
C继承A
我需要创建一个包含vector<A*> vect
的类D,其中存储了B类和C类的对象。我的想法是创建classA指针并为它们分配classB和C对象的地址。从我收集的内容来看,这被称为向上转换?
但是,只有classA属性存储在向量中,继承的属性不是。
这是包含向量的类:
class D{
vector<A*> vect;
public:
MagazinVirtual& operator+=(A* obj){
vect.push_back(obj);
return *this;
}
friend ostream& operator<<(ostream& out, D &obj){
vector<A*>::iterator it;
for (it = obj.vect.begin(); it != obj.vect.begin(); ++it)
out << **it << endl;
return out;
}
};
A类变量:
class A{
static int cod;
char* denumire;
int garantie;
float pret;
int stoc;
};
B组:
class B:public A{
char* os;
bool tipEcran;
float diagonala;
};
C类:
class C:public A{
int tipAccesoriu;
这里是我如何向向量添加对象:(不要向我发送可怕的名字和链接的构造函数调用,它是针对OOP类的,并且出于某种原因他们想要完全相同在main();
中调用int main(){
B t1, t2("nokia 231", 2, 27, 10, "and", 1, 4);
//t1 = t2;
C a1("Husa EH-17", 1, 2, 100, 0), a2("Card SD64", 1, 10, 100, 2), a3 = a2;
D dvect;
A *ptr1 = &t1;
A *ptr2 = &a1;
a += ptr1;
a += ptr2;
cout << a;
return 0;
}
当为A类使用重载的ostream运算符时,尽管向量中应该有2个元素(1B 1C),但它只打印出FIRST推送对象的classA属性,这是一个classB对象。在这种情况下,它打印出来:
nokia 231 / 2 / 27 / 10
这里是B类的ostream运算符:
friend ostream& operator<<(ostream &out, B&obj){
out << (A&)obj << obj.os << endl <<obj.tipEcran
<<endl<<obj.diagonala<<endl;
return out;
}
对于C班:
friend ostream& operator<<(ostream &out, C &obj){
out << (A&)obj << obj.tipAccesoriu << endl;
return out;
}
对于长篇文章感到抱歉,如果它看起来像一个愚蠢的问题,但指针真的让我头晕目眩。感谢您的时间!
答案 0 :(得分:3)
运行时多态性仅通过基类的虚函数发生。您的operator<<
方法既不是虚方法也不是基类的成员。
通常的解决方案是仅为ostream& operator<<(ostream &out, A&obj)
而不是A
或B
定义C
,但在该函数内部不要直接实现它。而是将ostream&
作为参数传递给类的虚函数。如(内部A):
friend ostream& operator<<(ostream &out, A&obj){
return A.serialize( out );
}
virtual ostream& serialize(ostream &out) { ... };
然后声明并定义:
ostream& B::serialize(ostream &out){
A::serialize(out) << os << endl <<tipEcran
<<endl<<diagonala<<endl;
return out;
}
答案 1 :(得分:0)
+它只打印一行,因为条件不好,它会停止!做第一次迭代。
for (it = obj.vect.begin(); it != obj.vect.begin(); ++it)
^^^^^
通常,一个人放在那里
obj.vect.end()