gpt4 book ai didi

c++ - 将指向基类的指针转换为指向子类的指针 - C++

转载 作者:行者123 更新时间:2023-11-30 03:52:40 26 4
gpt4 key购买 nike

这篇文章是这个 Question 的一个工作示例.但是,有几点让我感到困惑。这就是为什么我将其作为另一个问题发布。

基本上,问题是如何将基类转换为其子类。人们建议使用动态内存和new子类的新实例。

我想到了以下解决方案,现在想知道它是如何工作的。我创建了基类 (Employee) 的对象。设置它的 ID。然后我将其指针转换为子类的指针并设置更多成员。

// Example program
#include <iostream>
#include <string>
#include <list>
#include <algorithm>
using namespace std;

class Employee {
public:
int getId() { return id;}
void setId( int id) {this->id = id;}
protected:
int id;

};

class PartTimeEmployee : public Employee {

};

class FullTimeEmployee : public Employee {
public:
int getGrade() {return grade;}
void setGrade(int grade) {this->grade = grade;}
private:
int grade;
};

class Organization {
public:
void addEmployee(Employee* e) { empList.push_back(e); }
Employee* getEmployee(int id) {
for (std::list<Employee*>::iterator it=empList.begin(); it!=empList.end(); ++it) {
if((*it)->getId() == id) {return (*it);}
}
return NULL;
}
private:
std::list<Employee*> empList;
};

int main()
{
Employee e1;
e1.setId(5);

FullTimeEmployee *pFt1 = (FullTimeEmployee*) &e1;
pFt1->setGrade(1);

Organization org1;
org1.addEmployee(pFt1);
FullTimeEmployee* pFt2 = (FullTimeEmployee*) org1.getEmployee(5);
cout << pFt2->getId() << endl;
cout << pFt2->getGrade() << endl;
}

为什么有效?我是这样看的:

员工:|--id--|...全职员工:|--id--|--grade--|...

1- 这是在后台发生的事情吗?当我转换到 FullTimeemployee 时,C++ 会复制 Employee 类的所有预先存在的成员,并根据新成员的大小为您提供更多空间类型。

2- 使用这种方法安全吗? 我应该更喜欢动态内存分配,例如FullTimeEmployee *pFT1 = new FullTimeEmployee(); 超过这个?如果是,为什么?为什么我不能只使用指针转换?

更新:这个示例与转换为 void* 有何不同?你只是玩内存地址。只要您知道需要多少内存,就会出什么问题?

最佳答案

它只是似乎 起作用,因为e1 不是任何子类的实例,导致undefined behavior .

要让它工作,你需要使用动态内存分配:

Emplyoee *e1 = new FullTimeEmployee;

现在它适用于转换,因为 e1 实际上指向一个 FullTimeEmployee 对象。

但是你真的应该使用static_cast,比如

FullTimeEmployee *pFt1 = static_cast<FullTimeEmployee*>(e1);
pFt1->setGrade(1);

或者只是

static_cast<FullTimeEmployee*>(e1)->setGrade(1);

您还应该阅读 downcasting ,这就是您正在做的事情。

关于c++ - 将指向基类的指针转换为指向子类的指针 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30525768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com