如何使用模板类型作为函数参数派生抽象模板 类 (C++11)
How to derive abstract template classes, with template-types as function parameters (C++11)
我被指派编写一个 class "binaryExpressionTree" 派生自抽象模板 class "binaryTreeType." binaryExpressionTree 是字符串类型。作为作业的一部分,我必须从 binaryTreeType:
中覆盖这 3 个虚函数
//Header File Binary Search Tree
#ifndef H_binaryTree
#define H_binaryTree
#include <iostream>
using namespace std;
//Definition of the Node
template <class elemType>
struct nodeType
{
elemType info;
nodeType<elemType> *lLink;
nodeType<elemType> *rLink;
};
//Definition of the class
template <class elemType>
class binaryTreeType
{
public:
virtual bool search(const elemType& searchItem) const = 0;
virtual void insert(const elemType& insertItem) = 0;
virtual void deleteNode(const elemType& deleteItem) = 0;
binaryTreeType();
//Default constructor
};
binaryTreeType<elemType>::binaryTreeType()
{
}
#endif
这是我目前对 binaryExpressionTree 的了解:
#define EXPRESSIONTREE_H
#include "binaryTree.h"
#include <iostream>
#include <string>
class binaryExpressionTree : public binaryTreeType<string> {
public:
void buildExpressionTree(string buildExpression);
double evaluateExpressionTree();
bool search(const string& searchItem) const = 0;
void insert(const string& insertItem) = 0;
void deleteNode(const string& deleteItem) = 0;
};
这里是 binaryExpressionTree.cpp:
#include <string>
#include <cstring>
#include <stack>
#include <cstdlib>
#include <cctype>
#include "binaryExpressionTree.h"
#include "binaryTree.h"
using namespace std;
bool binaryExpressionTree::search(const string& searchItem) const {
return false;
}
void binaryExpressionTree::insert(const string& insertItem) {
cout << "this";
}
void binaryExpressionTree::deleteNode(const string& deleteItem) {
cout << "this";
}
这是main.cpp:
#include <iostream>
#include <iomanip>
#include <fstream>
#include "binaryExpressionTree.h"
int main()
{
binaryExpressionTree mainTree = binaryExpressionTree(); //Error:[cquery] allocating an object of abstract class type 'binaryExpressionTree'
return 0;
}
问题是,由于 binaryExpressionTree 是派生的 class 类型的字符串,它不知道 "elemType" 是什么意思,我需要更改 searchItem, insertItem and deleteItem
到字符串和对象。但是一旦我这样做了,编译器就不再识别我正在覆盖虚函数(因为我已经更改了它们的参数),并且将 binaryExpressionTree 声明为抽象 class。我该如何解决这个问题,以便我可以覆盖函数并使 binaryExpressionTree 成为非抽象的?
假设摘要class定义如下:
template <typename elemType>
class binaryTreeType { ... }
您应该按如下方式定义您的 class:
class binaryExpressionTree : public binaryTreeType<String> { ... }
编辑:原始问题已编辑。
您错误地声明了覆盖函数(在 binaryExpressionTree 中)。
你的声明是这样的:
bool search(const string& searchItem) const = 0;
这样的声明创建了一个纯虚方法(因为声明末尾的 = 0
。纯虚方法(也称为抽象方法)是一种必须被派生 class。因此,binaryTreeType
声明其方法是纯虚拟的,以便 you 在 binaryExpressionTree
.
中实现
类 具有尚未实现的抽象方法,无法实例化 - 这是您的编译器生成的错误。
相反,您应该这样声明您的方法:
virtual bool search(const elemType& searchItem) const;
这样的声明创建常规虚函数,它将覆盖父实现(在这种情况下不存在)。
TL;DR - 删除 = 0
.
我被指派编写一个 class "binaryExpressionTree" 派生自抽象模板 class "binaryTreeType." binaryExpressionTree 是字符串类型。作为作业的一部分,我必须从 binaryTreeType:
中覆盖这 3 个虚函数//Header File Binary Search Tree
#ifndef H_binaryTree
#define H_binaryTree
#include <iostream>
using namespace std;
//Definition of the Node
template <class elemType>
struct nodeType
{
elemType info;
nodeType<elemType> *lLink;
nodeType<elemType> *rLink;
};
//Definition of the class
template <class elemType>
class binaryTreeType
{
public:
virtual bool search(const elemType& searchItem) const = 0;
virtual void insert(const elemType& insertItem) = 0;
virtual void deleteNode(const elemType& deleteItem) = 0;
binaryTreeType();
//Default constructor
};
binaryTreeType<elemType>::binaryTreeType()
{
}
#endif
这是我目前对 binaryExpressionTree 的了解:
#define EXPRESSIONTREE_H
#include "binaryTree.h"
#include <iostream>
#include <string>
class binaryExpressionTree : public binaryTreeType<string> {
public:
void buildExpressionTree(string buildExpression);
double evaluateExpressionTree();
bool search(const string& searchItem) const = 0;
void insert(const string& insertItem) = 0;
void deleteNode(const string& deleteItem) = 0;
};
这里是 binaryExpressionTree.cpp:
#include <string>
#include <cstring>
#include <stack>
#include <cstdlib>
#include <cctype>
#include "binaryExpressionTree.h"
#include "binaryTree.h"
using namespace std;
bool binaryExpressionTree::search(const string& searchItem) const {
return false;
}
void binaryExpressionTree::insert(const string& insertItem) {
cout << "this";
}
void binaryExpressionTree::deleteNode(const string& deleteItem) {
cout << "this";
}
这是main.cpp:
#include <iostream>
#include <iomanip>
#include <fstream>
#include "binaryExpressionTree.h"
int main()
{
binaryExpressionTree mainTree = binaryExpressionTree(); //Error:[cquery] allocating an object of abstract class type 'binaryExpressionTree'
return 0;
}
问题是,由于 binaryExpressionTree 是派生的 class 类型的字符串,它不知道 "elemType" 是什么意思,我需要更改 searchItem, insertItem and deleteItem
到字符串和对象。但是一旦我这样做了,编译器就不再识别我正在覆盖虚函数(因为我已经更改了它们的参数),并且将 binaryExpressionTree 声明为抽象 class。我该如何解决这个问题,以便我可以覆盖函数并使 binaryExpressionTree 成为非抽象的?
假设摘要class定义如下:
template <typename elemType>
class binaryTreeType { ... }
您应该按如下方式定义您的 class:
class binaryExpressionTree : public binaryTreeType<String> { ... }
编辑:原始问题已编辑。
您错误地声明了覆盖函数(在 binaryExpressionTree 中)。 你的声明是这样的:
bool search(const string& searchItem) const = 0;
这样的声明创建了一个纯虚方法(因为声明末尾的 = 0
。纯虚方法(也称为抽象方法)是一种必须被派生 class。因此,binaryTreeType
声明其方法是纯虚拟的,以便 you 在 binaryExpressionTree
.
类 具有尚未实现的抽象方法,无法实例化 - 这是您的编译器生成的错误。
相反,您应该这样声明您的方法:
virtual bool search(const elemType& searchItem) const;
这样的声明创建常规虚函数,它将覆盖父实现(在这种情况下不存在)。
TL;DR - 删除 = 0
.