C++从抽象类型定义类成员

C++ defining class member from an abstract type

本文关键字:定义 成员 类型 抽象类 抽象 C++      更新时间:2023-10-16

我正在尝试将一些代码从 C# 移动到 C++ 并且我正在尝试找到实现类层次结构的最佳方法。 在 C# 中,在派生类中,可以从抽象基类类型定义类成员变量。但是,当我搜索C++资源时,似乎我只能定义 来自另一个类中的抽象类型的指针或引用变量(否则编译器显示:"无法实例化抽象类"(,但这可能会对已定义对象的生存期产生问题,因为生存期是在使用它的类之外处理的。关于当 C# 代码映射到C++时应如何实现此类继承层次结构的任何建议?

Class Person
{
public:
virtual double getSalary() = 0;
private:
int rank;
}
Class Teacher : public Person
{
public:
double getSalary();
private:
Person manager;        /*<-- Compile error: error C2259: 'Person' : cannot instantiate abstract class */
}

直接回答您的问题:您不能定义抽象类型的类成员变量。在C++中,成员主要由内存大小定义,并且由于继承的类可能需要不同的内存量,因此这是不可能的。

但是,您可以使用指针或引用。

在您的情况下:

class Teacher : public Person
{
public:
double getSalary();
private:
Person* manager;
}

这存储了一个指向Person的指针,并且由于Teacher是一个Person,一个类型为Teacher的对象将是一个合法的目标。

示例性使用:我们创建一个二传手

Teacher::set_manager(Person* manager)
{
this->manager = manager;
}

并称它为喜欢

Teacher a;
Teacher* b = new Teacher;
a.set_manager(b);

(我使用二传手作为最简单的例子,不一定是因为我建议这样做。

也可能:

Teacher a;
Person* b = new Teacher;
a.set_manager(b);

(a需要是一个Teacher,但是,因为我们需要方法set_manager,如果我们不想投射(

顺便说一下,这里更好的做法是使用智能指针。阅读std::shared_ptr并为此相关。它看起来像

std::shared_ptr<Person> manager;

这里的重要区别:如果您习惯于垃圾守护进程,则需要手动释放原始指针的内存,而智能指针会在没有指向对象时自动释放内存。

也就是说,您似乎认为这些语言比它们更相似。我的建议是从头开始,从C++的基本教程开始,即使你应该碰巧是一个有成就的C#程序员。