gpt4 book ai didi

C++ 在子类中更改父类

转载 作者:行者123 更新时间:2023-11-28 08:00:07 25 4
gpt4 key购买 nike

我在这里的第一篇文章!多年来,我一直使用这个网站作为引用,并寻找常见问题的解决方案。不幸的是,我面临的这个问题还没有在这里找到!所以就在这里。我从事一个项目已有一段时间了。我的程序有几千行代码,所以我不会在这里全部发布。基本上,我有一个子类,我希望在其中将父类更改为已经在我的代码中某个地方初始化的子类。我不确定这是否可行,或者这是否是良好的代码实践。但我会让你们来判断!这是我面临的问题:

#include <stdio.h>

class Base

public:
int data;
Base(int);
};

class Child : public Base
{
public:
Child(void);
void run(Base*);
};

Base::Base(int var)
{
data=var;
}


void Child::run(Base* base)
{
this = base //I know that you can create a reference to the parent class
//by casting this pointer to a Base pointer, but was wondering
//if you can do this the other way around.
printf("%d\n",Base::data);
}

int main()
{
Base* base1 = new Base(5);
Base* base2 = new Base(3);
Child one();

one.run(base1);

delete base1;
delete base2;
base1=0;
base2=0;
return 0;
}

因此,如果这个编译(它没有)它会输出类似 5 的东西,如果我将运行方法参数更改为 base2,它应该打印类似 3 的东西。这可能吗?谢谢!

最佳答案

不,你不能那样做。 This 是一个只读指针。线路

 this = base;

将产生语法错误。

C++ 中的基类是静态的。它们不能在运行时更改。

尽管如此,如果您的类(包括基类和子类)没有虚函数,则以下将起作用:

(Base&)*this = *base;

同时我不鼓励你这样做。令人沮丧的原因是因为这样的代码很容易被更改。例如,如果将虚拟方法添加到任一类,则 VMT 将被覆盖。这可能不适用于多重继承。在我对 MSVC 的实验中,我注意到有时它会更改类的二进制布局中基类的顺序。

换句话说,如果您绝对确定编译器使用的布局,则可以使用它。如果您确定编译器将来不会更改此布局。如果不是,最好避免这种情况。

正确的做法是创建一个特殊的方法,逐字段复制到数据中。

关于C++ 在子类中更改父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11704455/

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