我正在尝试在程序中使用纯虚类作为参数,但是编译器报错:
Error 1 error C2259: 'Person': cannot instantiate abstract class
我猜测我得到这个错误是因为 A) 不可能实例化一个抽象类 B) 我不能像在C#中使用接口那样使用抽象类
下面的C#程序说明了我在C++程序中要做的事情。如何在C++中使用抽象类编写通用代码?如果我被迫使用更专业的Person版本,例如Employee,则该代码不是真正的通用代码。我需要使用模板吗?
C ++程序
#include<iostream>
#include<vector>
class Person {
public:
virtual std::string getName() = 0;
virtual void setName(std::string name) = 0;
virtual std::string toString() = 0;
private:
std::string name;
};
class Employee : public Person {
public:
std::string getName() {
return this->name;
}
void setName(std::string name) {
this->name = name;
}
std::string toString() {
return "name:" + this->name;
}
private:
std::string name;
};
class Repository {
public:
void add(Person& p) {
this->repo.push_back(p);
}
private:
std::vector<Person> repo;
};
int main(int argc, char* argv[])
{
Repository repo;
Employee emp1;
emp1.setName("John Doe");
repo.add(emp1);
return 0;
}
C# 程序
interface IPerson
{
string GetName();
void SetName(string name);
string ToString();
}
class Employee : IPerson
{
private string _name;
public string GetName() {
return this._name;
}
public void SetName(string name) {
this._name = name;
}
public override string ToString() {
return "name: " + this._name;
}
}
class Repository
{
private List<IPerson> _repo;
public Repository() {
this._repo = new List<IPerson>();
}
public void Add(IPerson p) {
this._repo.Add(p);
}
}
class Program
{
static void Main(string[] args)
{
Repository repo = new Repository();
Employee emp1 = new Employee();
emp1.SetName("John Doe");
repo.Add(emp1);
}
}
string ToString();
至少有点“奇怪”,因为所有的object
派生对象(几乎所有对象)都有一个可重载的string ToString();
。 - xanatos