Class 固有的虚拟字符串没有返回正确的东西
Class inherence virtual string not returning the right thing
我有一个奇怪的问题。我举了一个例子来解释问题是什么。我有 4 个 classes,其中一个获得指向 class 的指针,这是另外 2 个固有的。这是它的样子:
继承 classes:
class classA{
public:
classA(){}
virtual std::string getType(){return "classA";}
classA& operator=(const classA& classa) {return *this;}
};
class classB: public classA {
int b;
public:
classB(int n){b=n;}
virtual std::string getType() { return "classB"; }
void setB(const int b){this->b=b;}
int getB() const{return this->b;}
};
class classC: public classA {
int c;
public:
classC(int n){c=n;}
virtual std::string getType() { return "classC"; }
void setC(const int c){this->c=c;}
int getC() const{return this->c;}
};
唯一重要的是getType()
函数。
这里现在是 class 获取指向 classA
的指针
class superClass{
classA* _classA;
int nb;
public:
superClass(){nb=0;}
void addElement(classA& e){
classA *newTab=new classA[++nb]; // create tab as the same size than the other +1
for(int i=0;i<nb-1;i++)
newTab[i]=_classA[i]; // add element from the old class to the new one
newTab[nb-1]=e; // add the element
//delete[] _classA;
_classA=newTab; // now copy it to the class
//delete[] newTab;
}
classA* getClass() {return _classA;}
int getNb() const{return this->nb;}
void displayElements(){
for(int i=0;i<getNb();i++)
std::cout << _classA[i].getType() << std::endl;
}
};
addElemment() 是一个函数,它 malloc a classA element 和一个 space more,它填充了旧元素,然后它添加了新元素,就这样了。是有效的,但问题就在这里。我不使用 classA 元素,只使用它的子元素。我想在超类中添加 classB 元素和 classC 元素,并使用 getType() 获取 class 类型;这是主要文件
int main(int argc, char const *argv[])
{
classB *classb = new classB(9);
classC *classc = new classC(10);
superClass super;
super.addElement(*classb);
super.displayElements();
// Display "classA" instead of "classB"
super.addElement(*classc);
super.displayElements();
// Display "classA" and "classA" instead "classB" and "classC"
//std::cout << classb->getType() << std::endl; // return ClassA
//std::cout << classc->getType() << std::endl; // return ClassA
return 0;
}
我只想让我的程序显示右边 class,子 class。我认为问题来自 addElement() 。我尝试使用虚拟 std::string getType()=0;
但它仍然不起作用,它没有任何改变。
我也试过使用模板,但没有任何改变也不起作用
我的问题:我希望我的程序每次都显示子 class 而不是 classA。
newTab
是classA
的数组。因此,它不能包含 classB
个对象,只能包含 classA
个对象。
newTab[nb-1]=e;
在这里,如果 e
指的是一个 classB
对象,这个赋值将 classB
部分从它切掉,所以它变成了一个 classA
对象并且可以适应在数组中。这被称为 object slicing.
您应该将超类中的声明成员_classA 更改为:classA** _classA;。
所以它会是这样的:
class superClass
{
classA** _classA;
int nb;
public:
superClass():_classA(0) // you also should initialize this to avoid crash while first delete[] of this _classA
{
nb = 0;
}
~superClass() // also you should add destructor to free memory
{
for (int i = 0; i < nb; i++)
{
delete _classA[i];
_classA[i] = nullptr;
}
delete[] _classA;
_classA[i] = nullptr;
}
void addElement(classA& e)
{
int oldSize = nb;
nb++; // increment the size separately for clarity
classA **newTab = new classA*[nb]; // create tab as the same size than the other +1
for (int i = 0; i < oldSize; i++)
newTab[i] = _classA[i]; // add element from the old class to the new one
classA* newElement = new classA(e); // use the copy-constructor
newTab[oldSize] = newElement; // add the element
delete[] _classA; // now you can free it
_classA = newTab; // now copy it to the class
}
classA** getClass()
{
return _classA;
}
int getNb() const
{
return this->nb;
}
void displayElements()
{
for (int i = 0; i < getNb(); i++)
std::cout << _classA[i]->getType() << std::endl;
}
};
我有一个奇怪的问题。我举了一个例子来解释问题是什么。我有 4 个 classes,其中一个获得指向 class 的指针,这是另外 2 个固有的。这是它的样子: 继承 classes:
class classA{
public:
classA(){}
virtual std::string getType(){return "classA";}
classA& operator=(const classA& classa) {return *this;}
};
class classB: public classA {
int b;
public:
classB(int n){b=n;}
virtual std::string getType() { return "classB"; }
void setB(const int b){this->b=b;}
int getB() const{return this->b;}
};
class classC: public classA {
int c;
public:
classC(int n){c=n;}
virtual std::string getType() { return "classC"; }
void setC(const int c){this->c=c;}
int getC() const{return this->c;}
};
唯一重要的是getType()
函数。
这里现在是 class 获取指向 classA
的指针class superClass{
classA* _classA;
int nb;
public:
superClass(){nb=0;}
void addElement(classA& e){
classA *newTab=new classA[++nb]; // create tab as the same size than the other +1
for(int i=0;i<nb-1;i++)
newTab[i]=_classA[i]; // add element from the old class to the new one
newTab[nb-1]=e; // add the element
//delete[] _classA;
_classA=newTab; // now copy it to the class
//delete[] newTab;
}
classA* getClass() {return _classA;}
int getNb() const{return this->nb;}
void displayElements(){
for(int i=0;i<getNb();i++)
std::cout << _classA[i].getType() << std::endl;
}
};
addElemment() 是一个函数,它 malloc a classA element 和一个 space more,它填充了旧元素,然后它添加了新元素,就这样了。是有效的,但问题就在这里。我不使用 classA 元素,只使用它的子元素。我想在超类中添加 classB 元素和 classC 元素,并使用 getType() 获取 class 类型;这是主要文件
int main(int argc, char const *argv[])
{
classB *classb = new classB(9);
classC *classc = new classC(10);
superClass super;
super.addElement(*classb);
super.displayElements();
// Display "classA" instead of "classB"
super.addElement(*classc);
super.displayElements();
// Display "classA" and "classA" instead "classB" and "classC"
//std::cout << classb->getType() << std::endl; // return ClassA
//std::cout << classc->getType() << std::endl; // return ClassA
return 0;
}
我只想让我的程序显示右边 class,子 class。我认为问题来自 addElement() 。我尝试使用虚拟 std::string getType()=0;
但它仍然不起作用,它没有任何改变。
我也试过使用模板,但没有任何改变也不起作用
我的问题:我希望我的程序每次都显示子 class 而不是 classA。
newTab
是classA
的数组。因此,它不能包含 classB
个对象,只能包含 classA
个对象。
newTab[nb-1]=e;
在这里,如果 e
指的是一个 classB
对象,这个赋值将 classB
部分从它切掉,所以它变成了一个 classA
对象并且可以适应在数组中。这被称为 object slicing.
您应该将超类中的声明成员_classA 更改为:classA** _classA;。 所以它会是这样的:
class superClass
{
classA** _classA;
int nb;
public:
superClass():_classA(0) // you also should initialize this to avoid crash while first delete[] of this _classA
{
nb = 0;
}
~superClass() // also you should add destructor to free memory
{
for (int i = 0; i < nb; i++)
{
delete _classA[i];
_classA[i] = nullptr;
}
delete[] _classA;
_classA[i] = nullptr;
}
void addElement(classA& e)
{
int oldSize = nb;
nb++; // increment the size separately for clarity
classA **newTab = new classA*[nb]; // create tab as the same size than the other +1
for (int i = 0; i < oldSize; i++)
newTab[i] = _classA[i]; // add element from the old class to the new one
classA* newElement = new classA(e); // use the copy-constructor
newTab[oldSize] = newElement; // add the element
delete[] _classA; // now you can free it
_classA = newTab; // now copy it to the class
}
classA** getClass()
{
return _classA;
}
int getNb() const
{
return this->nb;
}
void displayElements()
{
for (int i = 0; i < getNb(); i++)
std::cout << _classA[i]->getType() << std::endl;
}
};