英文:
virtual method overridden issue with unique_ptr move semantics
问题
在下面的代码片段中,似乎虚拟方法在适配器对象中没有被覆盖,而且目标(Target)对象和适配器(Adapter)对象都显示相同的输出。
#include <iostream>
#include <memory>
using namespace std;
class Target
{
public:
virtual std::string getResponse()
{
return "simple response";
}
};
class Adaptee
{
public:
std::string getSpecialRequest()
{
return "Special response";
}
};
class Adapter : public Target
{
unique_ptr<Adaptee> m_adaptee;
public:
Adapter(unique_ptr<Adaptee> adaptee) : m_adaptee(std::move(adaptee))
{
}
std::string getResponse() const
{
return m_adaptee->getSpecialRequest();
}
};
class client
{
unique_ptr<Target> m_target;
public:
client(unique_ptr<Target> target)
{
m_target = std::move(target);
std::cout << m_target->getResponse();
}
};
int main()
{
unique_ptr<Target> oj = make_unique<Target>();
unique_ptr<Adaptee> oj1 = make_unique<Adaptee>();
unique_ptr<Target> oj2 = make_unique<Adapter>(std::move(oj1));
client instance(std::move(oj));
client oj3(std::move(oj2));
return 0;
}
输出结果:simple response simple response
期望的输出结果:simple response special response;
看起来这是从目标(Target)传输到适配器(Adapter)对象的对象转移的问题。请提供建议。
英文:
It looks like in below code snippet virtual method overridden is not happening with Adapter object and both Target and Adapter object is showing same output.
#include <iostream>
#include <memory>
using namespace std;
class Target
{
public:
virtual std::string getResponse ()
{
return "simple response";
}
};
class Adaptee
{
public:
std::string getSpecialRequest ()
{
return "Special response";
}
};
class Adapter:public Target
{
unique_ptr < Adaptee > m_adaptee;
public:
Adapter (unique_ptr < Adaptee > adaptee ) : m_adaptee (std::move (adaptee))
{
// m_adaptee = std::move (adaptee);
}
std::string getResponse () const
{
return m_adaptee->getSpecialRequest ();
}
};
class client
{
unique_ptr < Target > m_target;
public:
client ( unique_ptr < Target > target)
{
m_target = std::move (target);
std::cout << m_target->getResponse ();
}
};
int main ()
{
unique_ptr <Target> oj = make_unique <Target> ();
unique_ptr <Adaptee > oj1 = make_unique <Adaptee> ();
unique_ptr < Target > oj2 = make_unique<Adapter> (std::move(oj1));
client instance (std::move (oj));
client oj3 (std::move (oj2));
return 0;
}
output : simple response
simple response
expected output : simple response
special response;
it looks like it is issue of object transfer-ship from Target to Adapter object.Please suggest.
答案1
得分: 1
Adapter
类中声明的 getResponse
函数
std::string getResponse () const
{
return m_adaptee->getSpecialRequest ();
}
不是一个虚函数,它没有覆盖 Target
类中同名函数的虚函数
class Target
{
public:
virtual std::string getResponse ()
{
return "simple response";
}
};
因为这两个函数在 const
限定符上有差异。
在声明覆盖其他虚函数的虚函数时,始终使用 override
限定符。在这种情况下,如果函数实际上没有覆盖其他虚函数,编译器会发出错误。
例如,如果你写成这样:
std::string getResponse () const override
{
return m_adaptee->getSpecialRequest ();
}
那么编译器会报错,问题将会变得清晰。
英文:
The function getResponse
declared in the class Adapter
std::string getResponse () const
{
return m_adaptee->getSpecialRequest ();
}
is not a virtual function that overrides the function with the same name in the class Target
class Target
{
public:
virtual std::string getResponse ()
{
return "simple response";
}
};
because the functions differ in the qualifier const
.
Always use the specifier override
in declarations of virtual functions that override other virtual functions. In this case the compiler can issue an error if a function actually does not override other virtual function.
For example if you would write
std::string getResponse () const override
{
return m_adaptee->getSpecialRequest ();
}
then the compiler issued an error and it would be clear what is the problem.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论