Я пытаюсь использовать чисто виртуальный класс в качестве параметра в программе, однако, я получаю ошибку компиляции:C++ vs. C# - Использование интерфейсов/чистые виртуальные классы
Error 1 error C2259: 'Person': cannot instantiate abstract class
Я думаю, ошибка im get - это потому, что A) не удается создать экземпляр абстрактного класса, и B) я не могу использовать абстрактный класс, так как я бы использовал интерфейс в C#
Программа C#, приведенная ниже, иллюстрирует, что я пытаюсь сделать в C++. Как написать общий код, используя абстрактные классы в C++? если им пришлось использовать более специализированную версию Person, например. Сотрудник, код не является общим. Нужно ли использовать шаблоны?
Программа 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);
}
}
В C#, помещающем 'string ToString();' в интерфейсе, по крайней мере, немного «странно», потому что все объекты, созданные 'object' (почти все) имеют перегружаемую строку' ToString(); ' – xanatos