gpt4 book ai didi

C++ 使用继承的父类转换为对象类

转载 作者:行者123 更新时间:2023-11-30 01:09:41 25 4
gpt4 key购买 nike

我有这样的类结构,其中 classD 和 classE 的祖 parent 是相同的

classB : classA;
classC : classA;

classD : classB;
classE : classC;

然后我有一个函数需要传递一个对象classF

classF : classA;
function(classF *func);

是否可以将 classD 和 classE 类型的对象传递给需要 classF 类型的函数?示例实现如下:是否可以将两者都投给他们共同的祖 parent ?

classD *d = new classD();
classE *e = new classE();

classA *func = (classA*)d;
function(func);

func = (classA*)e;
function(func);

最佳答案

不,不,还有一次不。

根本没有通过集合的行是这样的:

function(func);

这需要向下转型,即 - 从父类到子类的转型。向下转换不会隐式发生,这意味着该行不会编译(但如果您提供了编译代码,您应该已经知道了)。以下将编译:

function((classF*)func);

但你不应该使用它。向下转型的结果是未定义的,除非该引用最初属于该类型。所以,这没关系:

classF *f = new classF();
func = (classA*) f;
function((classF*)func);

但这不是:

classB *b = new classB();
func = (classA*) b;
function((classF*)func);

编辑添加

如果向下转换是使用专用的 C++ 转换运算符 dynamic_cast 执行的,则代码会在运行时确保向下转换是正确的。所以:

classF *f = new classF();
func = (classA*) f;
classF *newf = dynamic_cast<classF *>(func); // Okay
classB *b = new classB();
func = (classA*) b;
newf = dynamic_cast<classF *>(func); // newf is now NULL

这允许运行时检查您没有犯错。

就个人而言,我不喜欢在实际设计中依赖它,而只是为了验证。在这种情况下,最好动态转换引用而不是指针。动态转换不正确的指针会导致 NULL。动态转换不正确的引用会引发异常:

classF *f = new classF();
func = (classA*) f;
classF *newf = &dynamic_cast<classF &>(*func); // Okay
classB *b = new classB();
func = (classA*) b;
newf = &dynamic_cast<classF &>(*func); // Throws an exception

关于C++ 使用继承的父类转换为对象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39847002/

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