用c++中的纯虚拟方法抽象模板类
Abstract template class with pure virtual method in c++
public/Interface.h
#pragma once
template <typename T>
class BaseInterface {
public:
virtual void foo() = 0;
};
private/Base.h
#pragma once
#include "../public/Interface.h"
template <typename T>
class Base : public BaseInterface<T> {
public:
virtual void foo() override;
};
template <typename T>
inline void Base<T>::foo() {
}
main.cpp
#include <iostream>
#include <memory>
#include "public/Interface.h"
int main() {
auto base = std::make_shared< BaseInterface<std::string> >();
base->foo();
return 0;
}
获取此错误:
/usr/include/c++/5/ext/new_allocator.h:120:4: error: invalid new-expression of abstract class type ‘BaseInterface<std::__cxx11::basic_string<char> >’
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
AbstractPureVirtual/public/Interface.h:4:7: note: because the following virtual functions are pure within ‘BaseInterface<std::__cxx11::basic_string<char> >’:
class BaseInterface {
AbstractPureVirtual/public/Interface.h:6:17: note: void BaseInterface<T>::foo() [with T = std::__cxx11::basic_string<char>]
virtual void foo() = 0;
虽然我已经重写了派生类中的纯虚拟方法,并且它似乎是一个模板类,但我还是收到了这个错误。如果我需要做类似的事情,我应该如何实现它?
make_shared
创建一个与您指定的类完全相同的对象。它无法知道它的派生类,所以make_shared< BaseInterface<std::string> >()
本质上调用new BaseInterface<std::string>
,并且不允许创建抽象类的对象。这与模板无关;如果用普通类替换它们,错误仍然存在。
auto base = std::make_shared< BaseInterface<std::string> >();
您尝试在此处创建BaseInterface<std::string>
类型的具体对象。我怀疑你想要:
auto base = std::make_shared< Base<std::string> >();
或者
std::shared_ptr< BaseInterface<std::string> > base = std::make_shared< Base<std::string> >();
相关文章:
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- c++ 中的抽象方法是否曾经调用过?
- C++在基类本身中重写基类的抽象方法
- C++使用*this从静态方法调用一个抽象方法
- 当后代需要不同的参数列表时,我应该如何在基类中定义抽象方法
- C++未解析的外部符号,在2个虚拟抽象方法上有50%的机会
- 从抽象类继承的抽象方法是否存在任何性能问题
- 从继承的类中实现抽象方法
- 在超类中调用抽象方法,并在C++中的子类中实现它
- 接口更改:为抽象c++方法添加新参数
- 类在c++中仍然是抽象的,即使模板类实现了抽象方法
- 使用其他基类的方法满足纯抽象方法的最简单方法是什么
- 使用指令和抽象方法
- 如何在可变上下文中使用抽象类时实现抽象方法
- 类中同时包含抽象方法和虚方法
- 在抽象类中调用抽象方法
- C++和Java中的抽象方法和覆盖函数
- c++实现的抽象方法不尽如人意
- 在Python中继承c++的Base,使用SWIG调用抽象方法