提问人:duncan 提问时间:11/4/2023 更新时间:11/4/2023 访问量:66
C++模板函数、继承shared_ptr
C++ template function, inheritance, shared_ptr
问:
我想这是一个非常基本的问题,但我仍然在问,因为我怀疑编译器按预期运行,而错误来自我!
我想用模板抽象函数实现一个抽象类。如您所知,这是不可能的:模板函数不能是抽象的。
因此,我必须在我的基类中实现一个虚拟函数。 由于多种原因不方便,但就这样吧。
问题在于,一旦我使用指针,编译器就会调用基类函数,而不是子类实现。
如何解决这个问题?
#include <iostream>
#include <memory>
class Person
{
protected:
std::string _first_name;
std::string _last_name;
public:
Person(std::string first_name, std::string last_name):
_first_name(first_name), _last_name(last_name){}
const std::string & first_name() const { return _first_name; }
const std::string & last_name() const { return _last_name; }
};
// ==============================================================================
// Using template functions.
class HumanPrinterBase
{
public:
template <typename T>
void print(const T & person) const { std::cout << "HumanPrinterBase::print()" << std::endl; }
};
class HumanFirstNamePrinter : public HumanPrinterBase
{
public:
template <typename T>
void print(const T & person) const
{
std::cout << person.first_name() << std::endl;
}
};
// ==============================================================================
// Using non-template functions.
class PersonPrinterBase
{
public:
virtual ~PersonPrinterBase() = default;
virtual void print(const Person & person) const = 0;
};
class PersonFirstNamePrinter : public PersonPrinterBase
{
public:
virtual void print(const Person & person) const override
{
std::cout << person.first_name() << std::endl;
}
};
int main(int argc, char const *argv[])
{
Person person("John", "Doe");
std::unique_ptr<HumanPrinterBase> hp = std::make_unique<HumanFirstNamePrinter>();
hp->print(person); // "HumanPrinterBase::print()" (fails)
std::unique_ptr<PersonPrinterBase> pp = std::make_unique<PersonFirstNamePrinter>();
pp->print(person); // "John" (works)
return 0;
}
答: 暂无答案
评论
HumanPrinterBase
virtual void print(const PersonBase& person) = 0;