> dec C 中的Polymorphism
,不适用于字符串
我正在使用Dev C++ 5.9.2.
我有一个父类A
,类B,C,D,E
.....extends A
和类list
是我使用B,C,D.
的主要类
我不使用父A
,因为我想重用构造函数A。
问题如下
class A
{
public:
virtual void show(){
printf("A");
}
private:
string tokenS;
};
class B :public A
{
public:
virtual void show(){
printf("B:");
// return 0;
}
}
class list
{
public:
A* getNode(){
return pta;
}
void setNode(B temp){
this->pta=&temp;
}
protected:
private:
A *pt1;
};
int main(){
list ls;
B b1;
ls.setNode(b1);
ls.getNode()->show();
}
如果我使用
string tokenS
结果:A如果我使用
char* tokenS
结果:B:
我不明白它,如果我创建类并使用它,我有同样的错误
class Date
{
// code
};
class A
{
public:
virtual void show(){
printf("A");
}
private:
Date day;
};
class B :public A
{
public:
virtual void show(){
printf("B:");
// return 0;
}
}
问题就在这里:
void setNode(B temp){
this->pta=&temp;
}
这会将pta
设置为指向temp
,但当函数结束时temp
不再存在。这是修复它并保留多态性的方法:
class A
{
public:
virtual void show(){
printf("A");
}
virtual std::unique_ptr<A> clone() = 0;
private:
string tokenS;
};
class B :public A
{
public:
virtual void show(){
printf("B:");
// return 0;
}
virtual std::unique_ptr<A> clone()
{
return std::make_unique<B>(*this);
}
};
class list
{
public:
A& getNode(){
return *pt1;
}
void setNode(A& temp){
pt1 = temp.clone();
}
protected:
private:
std::unique_ptr<A> pt1;
};
int main(){
list ls;
B b1;
ls.setNode(b1);
ls.getNode().show();
}